2016-02-15 3 views
0

У меня есть следующий документ в коллекции:MongoDB - Возвращение только соответствующий массив из Object

{ 
    "_id" : 101, 
    "students" : [ 
     { 
      "name" : "john",    
      "age" : 10, 
      "city":'CA' 
     }, 
     { 
      "name" : "danial",    
      "age" : 15, 
      "city":'KA' 
     } 
    ] 
} 

{ 
    "_id" : 102, 
    "students" : [ 
     { 
      "name" : "adam",    
      "age" : 20, 
      "city":'NY' 
     }, 
     { 
      "name" : "johnson",    
      "age" : 12, 
      "city":'CA' 
     } 
    ] 
} 

И я огонь следующий запрос:

db.data.find({'students.city':'CA'}) 

Это возвращает меня «студентов» объекты из обоих документы, так как один экземпляр соответствует фильтру («город», «CA») в обоих.

Однако, я хочу получить только соответствующий массив. То есть, я хочу получить следующий результат:

{ 
    "_id" : 101, 
    "students" : [ 
     { 
      "name" : "john",    
      "age" : 10, 
      "city":'CA' 
     } 
    ] 
} 

{ 
    "_id" : 102, 
    "students" : [   
     { 
      "name" : "johnson",    
      "age" : 12, 
      "city":'CA' 
     } 
    ] 
} 

Пожалуйста, помогите.

ответ

3

Вы должны использовать $elemMatch в вашей проекции:

> db.data.find({'students.city':'CA'},{ students:{ $elemMatch:{'city':'CA'} }}) 
{ "_id" : 101, "students" : [ { "name" : "john", "age" : 10, "city" : "CA" } ] } 
{ "_id" : 102, "students" : [ { "name" : "johnson", "age" : 12, "city" : "CA" } ] } 

Btw: Я бы настоятельно рекомендуем прочитать Open letter to students with homework problems.

-1

Я думаю, вы должны использовать операцию агрегации.

Здесь у вас есть документация: https://docs.mongodb.org/manual/aggregation/

И аналогичный вопрос: Retrieve only the queried element in an object array in MongoDB collection

+0

Нет, это просто неправильно. См. [Мой ответ] (http://stackoverflow.com/a/35408883/1296707). –

+0

yep. Ты прав. после подтверждения снова. это лучше. Поправьте меня, если я ошибаюсь: Я сказал, чтобы использовать агрегат, потому что я думал, что вы не можете вернуть несколько элементов массива, соответствующих вашим критериям, используя операцию find(). но так как это разные документы и только один соответствующий элемент на документ. Ваш путь правильный. –

+0

Я не проверял, но думаю, что можно было бы использовать «$ или» в проекции ... –

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