Фильтрация вложенных документов в MongoDB - PullRequest
27 голосов
/ 26 января 2010

У меня возникают проблемы с пониманием того, как фильтровать внедренные документы в MongoDB, и начинаю думать, что мне следует использовать реляционную ассоциацию, но это не так в контексте хранилища документов.

Придерживаясь типичной системы блогов / комментариев, у меня есть коллекция blogs, и у каждого blog есть много comments. Комментарии хранятся в виде вложенных документов внутри документа блога.

Очень просто отфильтровать мою коллекцию blogs, но чтобы отфильтровать мои comments, встроенные в каждый blog, мне нужно загрузить их все в память (получить все в массив Ruby), и цикл по каждому комментарию, возвращая те, которые соответствуют определенным критериям.

Мои попытки отфильтровать внедренные документы с использованием точечной нотации не увенчались успехом и вернули все вложенные документы.

Есть ли лучший способ заставить MongoDB фильтровать их для меня, или я должен смириться с реляционными ассоциациями? (Вытягивание всех встроенных документов и ручная фильтрация будут слишком интенсивными в долгосрочной перспективе)

1 Ответ

22 голосов
/ 26 января 2010

В настоящее время нет способа фильтровать встроенные документы так, как вы описываете. Использование точечной нотации позволяет сопоставлять документы во встроенном документе, но весь документ, родитель и все, все равно будет возвращен. Также можно выбрать, какие поля будут возвращены, но это не очень помогает вашему делу.

У нас есть кейс «виртуальных коллекций», который бы реализовывал желаемую функциональность; не стесняйтесь голосовать за это:

http://jira.mongodb.org/browse/SERVER-142

Тем временем вы, вероятно, должны рассматривать комментарии как свою собственную коллекцию. В общем, если вам нужно работать с данным набором данных самостоятельно, сделайте его коллекцией. Если его лучше воспринимать как часть какого-то другого набора, его лучше встраивать.

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