MongoDB - Запрос встроенных документов - PullRequest
2 голосов
/ 21 июня 2011

У меня есть коллекция с именем Events.Каждый документ Event имеет коллекцию Participants в качестве встроенных документов.

Теперь у меня вопрос ... есть ли способ запросить Event и получить все Participants вот такВозраст> 18?

Ответы [ 3 ]

1 голос
/ 21 июня 2011

Когда вы запрашиваете коллекцию в MongoDB, по умолчанию она возвращает весь документ, соответствующий запросу.Если хотите, вы можете нарезать его и получить отдельный поддокумент.

Если все, что вам нужно, это участники старше 18 лет, то, вероятно, лучше всего сделать одно из двух:

Храните их в под-документе внутри документа мероприятия, который называется «Over18» или что-то в этом роде.Вставьте их в этот документ (и, возможно, в другой, если хотите), а затем, когда вы запрашиваете коллекцию, вы можете указать базе данных возвращать только вложенный документ «Over18».Недостатком этого является то, что вы храните своих участников в двух разных вложенных документах, и вам придется выяснить их возраст перед вставкой.Это может или не может быть осуществимо в зависимости от вашего приложения.Если вам нужно иметь возможность проверять произвольный возраст (то есть иногда ему 18, а иногда 21 или 25 и т. Д.), Это не сработает.

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

0 голосов
/ 04 июля 2012

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

db.events.aggregate(
  { $unwind: '$participants' }, 
  { $match: {'age': {$gte: 18}}},
  { $project: {participants: 1}
)

Это вернет список из n документов, где n - количество участников> 18, где каждая запись выглядит следующим образом (обратите внимание, что поле массива «участники» теперь содержит одну запись):

{ 
  _id: objectIdOfTheEvent, 
  participants: { firstName: 'only one', lastName: 'participant'} 
}

Возможно, он даже может быть расправлен на сервере, чтобы вернуть список участников. См. официальную документацию для получения дополнительной информации.

0 голосов
/ 21 июня 2011

Краткий ответ: нет.Я пытался сделать то же самое пару месяцев назад, но mongoDB не поддерживает его (по крайней мере, в версии <= 1.8).Этот же вопрос был задан в их группе Google наверняка.Вы можете сохранить участников как отдельную коллекцию или получить целые документы, а затем отфильтровать их на клиенте.Я далек от идеала, я знаю.Я все еще пытаюсь найти лучший способ обойти это ограничение. </p>

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