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, который должен содержать ссылку на необъявленный хеш или массив
,