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

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

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, но не думаю, что это актуально в моем примере, так как больше похоже на идентификаторы.

Будем признательны за любую помощь или обсуждение.


person user2924781    schedule 27.10.2013    source источник
comment
Ваши методы $whitelist-› представляют собой хэш-ссылку, а не массив. Что произойдет, если вместо этого написать [keys %{$whitelist->methods}]?   -  person raina77ow    schedule 27.10.2013
comment
Удивительно, кажется, работает и дает результат! Спасибо за вашу помощь :-)   -  person user2924781    schedule 27.10.2013
comment
Вы хотите, чтобы я опубликовал это как ответ, чтобы вы могли его принять? )   -  person raina77ow    schedule 27.10.2013
comment
Конечно, мне все кажется правильным, я просто дважды проверяю некоторые номера запросов, чтобы убедиться, но похоже, что я просто неправильно передавал данные, как вы говорите.   -  person user2924781    schedule 27.10.2013
comment
Цифры складываются при ручном запросе, так что рад принять ваш ответ   -  person user2924781    schedule 27.10.2013


Ответы (1)


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

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

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

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

.

person raina77ow    schedule 27.10.2013