2012-02-08 2 views
7

Учитывая пример документ ниже:MongoDB поле выбора, чтобы вернуть вложенный документ в массив

{ 
    "_id" : "2", 
    "objects" : [{ 
     "_id" : "1", 
     "name" : "embedded " 
    },{ 
     "_id" : "2", 
     "name" : "embedded " 
    },{ 
     "_id" : "3", 
     "name" : "embedded " 
    }], 
    "name" : "gloss2" 
} 

Можно ли вернуть только один поддокумент? Таким образом, мне не нужно выбирать весь родительский объект, получать список и прокручивать список, чтобы получить объект, о котором идет речь.

{ 
    "_id" : "2", 
    "name" : "embedded" 
} 

ответ

14

Можно ли вернуть только один поддокумент?

Да, но не так, как вы хотите. Если вы сделаете следующее, вы только получите обратно в первый элемент массива:

coll.find({_id:'2'}, { 'objects.0': 1}) 

Однако то, что вы действительно хотите что-то, что выглядит следующим образом:

coll.find({_id:'2', 'objects._id': '3'}, { 'objects.$' : 1}) 

Конечно, что фактически не работает в MongoDB.

Глядя на your other question, это одна из причин использования «внедренного объекта» вместо «массива объектов». С помощью «встроенного объекта» вы можете сделать следующее:

coll.find({_id:'2'}, {'objects.3': 1}) // where 3 is the id of the third object 

Это позволяет вам выбрать только «внедренные объекты», в которых вы нуждаетесь.

Таким образом, я не должен выбрать весь родительский объект ...

Дело с MongoDB в том, что родительский документ всегда неправдоподобным. Запросы возвращают документы верхнего уровня. Это запекается во всей архитектуре. Даже если вы запрашиваете только фрагмент документа, сервер все равно должен загрузить весь документ в память, прежде чем подавать вам запрошенный фрагмент.

Единственный способ это может быть новый Aggregation Framework, но это еще не в устойчивой ветке.

+0

Отлично, спасибо за объяснение. –

2

Вы можете вернуть один поддокумент, но вы не можете вернуть один элемент из массива. Сожалею.

0

Mongodb 3.2 представляет $ elemMatch с тем, что вы можете получить только один первый согласованный документ из массива документов.

db.sample.find({_id:"2"},{objects:{$elemMatch:{_id:"2"}}})