2015-11-18 6 views
0

У меня есть эти документы:документа запроса вложенного multiarray-массив MongoDB elemMatch

//document 1 
{ 
    info : [ 
     { 
      id : 100, 
      field : {     
       a : 1, 
       b : 2 
      } 
     }, 
     { 
      id : 200, 
      field : {     
       a : 3, 
       b : 4 
      } 
     }, 
     { 
      id : 300, 
      field : {     
       a : 5, 
       b : 6 
      } 
     } 
    ] 
}, 
//document 2 
{ 
    info : [ 
     { 
      id : 400, 
      field : {     
       a : 7, 
       b : 8 
      } 
     }, 
     { 
      id : 500, 
      field : {     
       a : 9, 
       b : 10 
      } 
     } 
    ] 
} 

Мне нужно найти идентификатор поддокумента со значениями field.a = 7 и field.b = 8, что означает, значение id равно 400.

То, что я пробовал, это $ elemMatch, но я не могу получить результат.

Мои attemps:

attemp 1:

db.mycollection.findOne({info : {$elemMatch : { 'field.$.a':7,'field.$.b':8 } } }); 

attemp 2:

db.mycollection.findOne({info:{$elemMatch:{$elemMatch:{'field.$.a':7,'field.$.b':8,}}}}); 

attemp 3:

db.mycollection.findOne({info:{$elemMatch:{$elemMatch:{'field.a.$':7,'field.b.$':8,}}}}); 

attemp 4:

db.mycollection.findOne({info:{$elemMatch:{'field.$.a':7,'field.$.b':8,}}}); 
+0

вам придется использовать структуру агрегации, чтобы получить поддокументе в идентификатор – inspired

+0

попробовать 'db.mycollection.findOne ({инфо: {$ elemMatch: {поле: {«а»: 7 , 'b': 8}}}}); ' – hecnabae

+0

это действительно работает, я просто использую проекцию ** db.mycollection.findOne ({info: {$ elemMatch: {поле: {'a': 7 , 'b': 8}}}}, {id: 1, info: {$ elemMatch: {поле: {'a': 7, 'b': 8}}}}); **, thanks @hecnabae –

ответ

1

$elemMatch оператор работает как «мини-запрос» против указанного элемента массива он действует на, так аргументы идут внутрь. Также positional $ оператор здесь является Собственостью из «проекции», а не сам документ запроса, так что это отдельный элемент:

db.mycollection.find(
    { 
     "info": { 
      "$elemMatch": { "field.a": 7 , "field.b": 8 } 
     } 
    }, 
    { "info.$": 1 } 
) 

Что и соответствует документу, содержащему совпавший элемент, а затем возвращает только совпадающий элемент благодаря проекции:

{ 
     "_id" : ObjectId("564d52979f28c6e0feabceee"), 
     "info" : [ 
       { 
         "id" : 400, 
         "field" : { 
           "a" : 7, 
           "b" : 8 
         } 
       } 
     ] 
} 
Смежные вопросы