2015-06-12 2 views
1

enter image description hereКак написать запрос в MongoDB, который дает мне все документы, содержащие все указанные вложенные документы?

Скажем, у меня был документ MongoDB с 2 встроенными документами, хранящимися в массиве «AD». Каждый из этих встроенных документов будет иметь конкретные данные, которые мне нужно сопоставить. Как написать запрос, чтобы найти этот документ?

В драйвере C# В настоящее время я пишу это так:

var q1 = Query.And(
    Query.EQ("AD.ABC1", "123"), 
    Query.EQ("AD.YOB", "1969") 
); 

var q2 = Query.And(
    Query.EQ("AD.ABC1", "456"), 
    Query.EQ("AD.YON", "1970") 
); 

var query = Query.And(q1, q2); 

Что дает мне запрос о:

{ 
    "$and": [ 
     { 
      "AD.ABC1": "123" 
     }, 
     { 
      "AD.YOB": "1969" 
     }, 
     { 
      "AD.ABC1": "456" 
     }, 
     { 
      "AD.YON": "1970" 
     } 
    ] 
} 

Это возвращает документы, которые имеют встроенные документы, которые соответствуют ЯВНО q1 или q2. Я хочу пересечение этого - то есть документы, которые имеют встроенные документы, соответствующие BOTH q1 AND q2.

Благодаря

+2

Посмотрите на [** '$ elemMatch' **] (http://docs.mongodb.org/ручной/справочник/оператор/запрос/elemMatch /). И здесь есть ответы на это. –

+0

Да, я посмотрел на страницу elemMatch и здесь, но никто не заходил в запрос документов, у которых было все несколько вложенных вложенных документов, если вы знаете, что я имею в виду. Во всяком случае, я попал туда, в конце концов ... – millarnui

ответ

0

Работали его

var q1 = Query.ElemMatch("AD", 
    Query.And(
     Query.EQ("ABC1", "123"), 
     Query.EQ("YOB", "1969") 
    ) 
); 

var q2 = Query.ElemMatch("AD", 
    Query.And(
     Query.EQ("ABC1", "456"), 
     Query.EQ("YOB", "1970") 
    ) 
); 

var query = Query.And(q1, q2); 

, который дает мне

{ 
"$and": [ 
    { 
     "AD": { 
      "$elemMatch": { 
       "ABC1": "123", 
       "YOB": "1969" 
      } 
     } 
    }, 
    { 
     "AD": { 
      "$elemMatch": { 
       "ABC1": "456", 
       "YOB": "1970" 
      } 
     } 
    } 
] 
} 
Смежные вопросы