Mongodb выберите поле для возврата встроенного документа в массив - PullRequest
7 голосов
/ 09 февраля 2012

Приведенный ниже пример документа:

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

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

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

Ответы [ 5 ]

16 голосов
/ 09 февраля 2012

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

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

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

Однако то, что вы действительно хотите, выглядит примерно так:

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

Конечно, это на самом деле не работает в MongoDB.

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

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

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

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

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

Единственным способом решения этой проблемы может быть новая Aggregation Framework , но это еще не в стабильной ветке.

2 голосов
/ 12 июля 2013

Вы можете сделать это с версией mongo> 2.2.

db.collection.find ({'objects._id': 1}, {'objects. $': True})

Но вы просто получите первый элемент соответствия http://docs.mongodb.org/manual/reference/projection/positional/

2 голосов
/ 09 февраля 2012

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

0 голосов
/ 20 декабря 2016

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

db.sample.find({_id:"2"},{objects:{$elemMatch:{_id:"2"}}})
0 голосов
/ 09 июня 2014

В последней версии mongodb (сейчас 2.6) есть проекция $elemMatch, которая помогает нам в этом случае. Если это кому-то поможет, на этой странице есть несколько примеров: http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/#proj._S_elemMatch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...