ограничить документы для Mapreduce с Mongoid - PullRequest
2 голосов
/ 08 января 2011

Я реализовал соотношение продуктов Пирсона через карту / уменьшить / завершить. Недостающая часть заключается в ограничении документов (представляющих пользователей), которые будут обрабатываться с помощью фильтра. Для простого запроса типа

mapreduce(mapper, reducer, :finalize => finalizer, :query => { :name => 'Bernd' })

Я получаю это на работу.

Но мои критерии фильтрации немного сложнее: у меня есть один набор предпочтений, который должен иметь хотя бы один общий элемент, и другой набор предпочтений, который может не иметь общего элемента. На более позднем этапе я также хочу ограничить это документами (пользователями) в пределах определенного географического расстояния.

В настоящее время у меня есть этот код, работающий в моей функции карты, но я бы предпочел разделить его на параметры запроса, поддерживаемые mongoid или функцией javascript. Все мои попытки решить эту проблему не увенчались успехом, поскольку код либо игнорируется, либо выдает ошибку.

Я сделал пару тестов.

[результаты удалены, см. Ниже]

Я использую гемы ruby ​​1.9.2, mongodb 1.6.5-x86_64 и mongoid 2.0.0.beta.20, mongo 1.1.5 и bson 1.1.5 на MacOS.

Что я делаю не так?

Заранее спасибо.

Дополнительные тесты (проблема частично решена):

User.where(:name.in => ["Arno", "Bernd", "Claudia"]) 

работает, однако при использовании mapreduce вот так

mapreduce(..., :query => { :name.in => ['Arno', 'Bernd', 'Claudia'] })

приводит к ошибке bson serialize: ключи должны быть строками или символами (TypeError) , упомянутыми выше.

Замена :name.in на 'name.in' или 'name.$in' приводит к тому, что запрос не возвращает результатов (предположим, что он передается как есть на mongodb).

Однако

mapreduce(..., :query => { :name => { '$in' => ['Arno', 'Bernd', 'Claudia'] } })

работает, но у меня не было успеха с моими попытками геопространственного запроса, независимо от того, как я написал выражение.

mapreduce(..., :query => {:location => { "$near" => [ 13, 52, 1 ] } })

приводит к этому сообщению об ошибке: Команда базы данных 'mapreduce' завершилась неудачно: {"assertion" => "Конфигурация ручного сопоставления не разрешена", ... .

Если бы кто-нибудь мог дать мне идею, как написать геопространственный запрос, используя near или within и работая с mapreduce, я был бы очень счастлив. (Я еще не играл с сетами, см. Выше).

...