Mongo mapper (Mongo DB) встроенный поиск документов в нескольких полях - PullRequest
0 голосов
/ 26 августа 2011
 "user_crawls": {
     "0": {
       "_id": ObjectId("4e4b5e1c151c0d0336000093"),
       "rand_id": "kPxMuXOY8Jfh6nXt",
       "network": "tw",
       "sourcenetwork": "874777",
       "sourceName": "Krishna",
    },
     "1": {
       "_id": ObjectId("4e4b5e1c151c0d0336000094"),
       "rand_id": "kPxMuXOY8Jfh6nXt",
       "network": "fb",
       "sourcenetwork": "145875",
       "sourceName": "Krishna",
    },
  "2": {
       "_id": ObjectId("4e4b5e1c151c0d0336000095"),
       "rand_id": "kPxMuXOY8Jfh6nXt",
       "network": "fb",
       "sourcenetwork": "145875",
       "sourceName": "Ram",
    }

Я хочу выбрать документы, чья сеть - fb, а имя источника - Кришна. Из вышеперечисленных данных обычно я хотел бы получить результат, второй документ с идентификатором

4e4b5e1c151c0d0336000094

Но я получаю все записи

Я использовал следующий код для сбора данных

DdNetworkCrawlLink.limit(10).all(:conditions => {'user_crawls.network' => "fb",'user_crawls.sourceName' => "Krishna")

Спасибо, что уделили время

Sreeraj

Ответы [ 2 ]

0 голосов
/ 29 августа 2011

При запросах в Mongo вы можете запрашивать только корневые документы.Так же и в MongoMapper.

Чтобы получить только совпадающие внедренные документы, сначала нужно запросить все корневые документы, а затем извлечь из них вложенные документы:

DdNetworkCrawlLink
.limit(10)
.all('user_crawls.network' => "fb",'user_crawls.sourceName' => "Krishna")
.map do |dbncl|
  dcncl.user_crawls.select { |uc| uc.network == "fb" && uc.sourceName == "Krishna" }
end.flatten

Поскольку приведенный выше код настолько запутан, рекомендуется встраивать документы только тогда, когда внедренные документы всегда будут использоваться / отображаться / нужны одновременно с их родителями.

0 голосов
/ 26 августа 2011

я думаю, что вы пропустили ':' char. в документации на mongomapper это говорит

Patient.all(:last_name => 'Johnson', :order => :last_name.asc)
...