2016-03-23 3 views
2

У меня есть некоторые структуры данных как этотКак использовать elemMatch, чтобы соответствовать гнездовой массив

{ 
    a: 1, 
    array1: [ 
    { 
     b: 2 
     array2: [ 
     { 
      // this is my target 
      c: 3, 
      d: 3 
     }, 
     { 
      c: 4, 
      d: 4 
     }   
     ] 
    }, 
    { 
     b: 3 
     array2: [ 
     { 
      c: 5, 
      d: 5 
     }, 
     { 
      c: 6, 
      d: 6 
     }   
     ] 
    } 
    ] 
} 

Я знаю, использовать {"array1" : {"$elemMatch" : {"b" : 2} } }, чтобы соответствовать элемент первого array1 уровня. Но я не знаю, как сопоставить элемент {c: 3, d: 3} массива array2.

+0

Что конкретно? Это легко неверно истолковать. Вы просто пытаетесь сопоставить свой документ с массивом '' array1.array2.c? 3'? (большой намек). Или вы ожидаете проекции только согласованных элементов? Это выглядит опасно абстрактным таким образом, что вы, вероятно, неправильно интерпретируете ответ в своих реальных данных. –

+0

На самом деле я хочу совместить этот элемент и проецировать его. –

+0

Как я уже сказал, * «Смысл чего?» *, Учитывая приведенное выше выражение запроса, которое я вам дал (что вам действительно нужно здесь, и ** не ** '$ elemMatch'), что вы ожидаете вернуться? Если вы ожидаете ** только ** 'c: 3' и ** not **' c: 4', то это делает ** большую ** разницу в ответе на вопрос. –

ответ

4

$elemMatch используется для государственного объединения среди нескольких полей в пределах одной и той же вложенной структуры.

Для примера. Если вы ищете запрос c и d и хотите, чтобы они принадлежали к одному и тому же поддоку, вы можете запросить его как.

{"array1.array2" : {"$elemMatch" : {"c" : 3, "d":3} } } 

Примечание: если вы запрашиваете на одно поле, вы действительно не нужно использовать $elemMatch (так как нет никакой связи)

Например, в вашем примере запроса, вы можете вместо этого

{"array1.b" : 2} 
3

попробуйте это, это мне очень помогает.

{ 
    "array1": { 
    "$elemMatch": { 
     "array2": { 
     "$elemMatch": { 
      "c": 3 
     } 
     } 
    } 
    } 
} 
+0

Вы можете заметить, что это обычно не требуется. См. Комментарий выше. –

Смежные вопросы