Perl mongo-> подсчет коллекций с использованием оператора $in

Мне было интересно, можно ли было использовать оператор "in" как можно из оболочки mongo, используя модуль perl MongoDB::Collection. Я перепробовал несколько вещей, но не получил ожидаемого результата. Я проверил документы и другие сообщения на stackru, но, похоже, не могу найти что-то конкретно по этому поводу, если я не пропускаю что-то.

http://docs.mongodb.org/manual/reference/operator/query/in/

Запрос на подсчет, который я запускаю через оболочку mongo:

mongo:PRIMARY> db.getCollection("Results").count( { TestClass : "TestClass", TestMethod : { $in: ["method1" , "method2", "method3"] } })
181605

Я пробовал это несколькими различными способами, передавая список в виде массива или хэш-ссылок или предварительного построения строки...

my $count = $mongo->{collection}->count({
                            'TimeStamp'     => { '$gt' => $ft, '$lt' => $tt },
                            'TestClass'     => $TestClass,
                            'TestMethod'    => { '$in' => [$whitelist->methods] },
                            'Result'        => $result
                    });

Где демпинг $whitelist->methods является

$VAR1 = {
      'method1' => 1,
      'method2' => 1,
      'method3' => 1
    };

Я посмотрел высоко и низко для ответа, кто-нибудь знает, способен ли драйвер в настоящее время использовать оператор $in, как этот? Циклический просмотр возвращаемых методов из предыдущего запроса и суммирование результатов потребуют больше кода.

Единственное другое сообщение о переполнении стека, которое я видел об операторе $in, это оператор $in mongoDB с _id в perl, который рекомендует использовать http://api.mongodb.org/perl/current/MongoDB/OID.html но не думаю, что это актуально в моем примере, так как выглядит больше как идентификаторы.

Любая помощь или обсуждение будет принята с благодарностью.

1 ответ

Решение

Проблема в том, что $in Предложение ожидает, что его значение будет ссылкой на массив, но вы добавляете в него хэш-ссылку (как показывает вывод Dumper). Самый простой способ превратить последнее в первое - это применить keys функция:

# ...
'TestMethod'    => { '$in' => [keys %{$whitelist->methods}] }

... или просто [keys $whitelist->methods], если вы используете Perl 5.14+, как...

начиная с Perl 5.14, keys может принимать скалярный EXPR, который должен содержать ссылку на необъявленный хеш или массив

,

Другие вопросы по тегам