MongoDB find() для возврата поддокумента при совпадении (поле, значение)

Это одна коллекция, в которой есть 2 файла json. Я ищу конкретное поле: значение в объекте и весь вложенный документ должны быть возвращены в случае совпадения (этот конкретный вложенный документ из коллекции должен быть возвращен из 2 вложенных документов в следующей коллекции). Заранее спасибо.

{
"clinical_study": {
"@rank": "379",
"#comment": [],
"required_header": {
  "download_date": "ClinicalTrials.gov processed this data on March 18, 2015",
  "link_text": "Link to the current ClinicalTrials.gov record.",
  "url": "http://clinicaltrials.gov/show/NCT00000738"
},
"id_info": {
  "org_study_id": "ACTG 162",
  "secondary_id": "11137",
  "nct_id": "NCT00000738"
},
"brief_title": "Randomized, Double-Blind, Placebo-Controlled Trial of Nimodipine for the Neurological Manifestations of HIV-1",
"official_title": "Randomized, Double-Blind, Placebo-Controlled Trial of Nimodipine for the Neurological Manifestations of HIV-1",
}

{
"clinical_study": {
"@rank": "381",
"#comment": [],
"required_header": {
  "download_date": "ClinicalTrials.gov processed this data on March 18, 2015",
  "link_text": "Link to the current ClinicalTrials.gov record.",
  "url": "http://clinicaltrials.gov/show/NCT00001292"
},
"id_info": {
  "org_study_id": "920106",
  "secondary_id": "92-C-0106",
  "nct_id": "NCT00001292"
},
"brief_title": "Study of Scaling Disorders and Other Inherited Skin Diseases",
"official_title": "Clinical and Genetic Studies of the Scaling Disorders and Other Selected Genodermatoses",
}

person Vamshi    schedule 05.04.2015    source источник
comment
У вас есть пример того, какое именно поле/значение и какой вложенный документ?   -  person chridam    schedule 05.04.2015
comment
Я провел поиск по этому шаблону (clinical_study.@rank, 379); и он соответствует, но не может получить поддокумент, в котором он присутствует.   -  person Vamshi    schedule 05.04.2015
comment
какой результат вы получите, когда выполните этот запрос в оболочке mongo db.TargetCollection.find({clinical_study.@rank: 379})   -  person Kevin Brady    schedule 05.04.2015
comment
Я возвращаю то же значение, которое я искал, вместо поддокумента   -  person Vamshi    schedule 05.04.2015


Ответы (1)


Ваши примеры документов имеют неверный формат — сейчас оба ключа clinical_study являются частью одного и того же объекта, и в этом объекте отсутствует закрывающий }. Я предполагаю, что вы хотите, чтобы они были двумя отдельными документами, хотя вы называете их вложенными документами. Не имеет смысла делать их вложенными документами документа, если они оба названы под одним и тем же ключом. Вы не можете сохранить документ таким образом, и в оболочке mongo он молча заменит первый экземпляр ключа вторым:

> var x = { "a" : 1, "a" : 2 }
> x
{ "a" : 2 }

Если вы просто хотите вернуть clinical_study часть документа при совпадении clinical_study.@rank, используйте проекцию:

db.test.find({ "clinical_study.@rank" : "379" }, { "clinical_study" : 1, "_id" : 0 })

Если вместо этого вы хотели, чтобы документы clinical_study были элементами массива внутри более крупного документа, используйте $. Здесь clinical_study теперь является именем поля массива, элементами которого являются два значения ключа clinical_study в ваших не-документах:

db.test.find({ "clinical_study.@rank" : "379" }, { "_id" : 0, "clinical_study.$" : 1 })
person wdberkeley    schedule 06.04.2015