Вы хотите структурировать свои коллекции и документы таким образом, который отражает то, как вы собираетесь использовать данные. Если вы собираетесь выполнять множество сложных запросов, особенно с субдокументами, вам может быть проще разбить документы на отдельные коллекции. Примером этого может быть разделение комментариев из сообщений в блогах.
Ваши комментарии могут быть сохранены в виде массива поддокументами:
# Example post document with comment subdocuments
{
title: 'How to Mongo!'
content: 'So I want to talk about MongoDB.',
comments: [
{
author: 'Renold',
content: 'This post, it's amazing.'
},
...
]
}
Это может вызвать проблемы, хотя, если вы хотите делать сложные запросы на только комментарии (например, выбирая самые последние комментарии от все сообщений или получения комментариев одним автором.) Если вы планируете создавать эти сложные запросы, вам лучше создать две коллекции: одну для комментариев, а другую для сообщений.
# Example post document with "ForeignKeys" to comment documents
{
_id: ObjectId("50c21579c5f2c80000000000"),
title: 'How to Mongo!',
content: 'So I want to talk about MongoDB.',
comments: [
ObjectId("50c21579c5f2c80000000001"),
ObjectId("50c21579c5f2c80000000002"),
...
]
}
# Example comment document with a "ForeignKey" to a post document
{
_id: ObjectId("50c21579c5f2c80000000001"),
post_id: ObjectId("50c21579c5f2c80000000000"),
title: 'Renold',
content: 'This post, it's amazing.'
}
Это похоже на то, как вы храните «ForeignKeys» в реляционной базе данных. Нормализация ваших документов, подобных этому, упрощает запросы к комментариям и сообщениям. Кроме того, поскольку вы разрываете свои документы, каждый документ занимает меньше памяти. Компромисс, однако, заключается в том, что вам нужно поддерживать ссылки ObjectId
всякий раз, когда есть какие-либо изменения в любом документе (например, когда вы вставляете/обновляете/удаляете комментарий или сообщение). И поскольку в Mongo нет крючков событий, вам нужно выполняйте все это техническое обслуживание в своем приложении.
С другой стороны, если вы не планируете выполнять сложные запросы в поддоку документах, вам может понадобиться хранить монолитные объекты. Например, предпочтения пользователя, это не то, что вы, вероятно, делать запросы для:
# Example user document with address subdocument
{
ObjectId("50c21579c5f2c800000000421"),
name: 'Howard',
password: 'naughtysecret',
address: {
state: 'FL',
city: 'Gainesville',
zip: 32608
}
}
Большое спасибо за то, что моя система представляет собой систему регистрации, когда документы будут вставлены они никогда не изменится, некоторые из них будут получать удалено, но это будет обрабатываться покупателем ttl 99,999% времени. Я думал, что могу хранить как основной документ, так и дочерний документ в той же коллекции. поэтому, когда мне нужно сделать запрос, я могу сделать or statment, чтобы получить мастер и дочерний элемент, и если я знаю, что мне не нужен один тип документа, я могу сделать там запрос $ nin. Но я не уверен, что если это становится сложным для монго и лучше всего делать «монолитный объект» – WojonsTech
Почему бы вам не попробовать сделать запросы, которые вы планируете сделать на фиктивной схеме, чтобы увидеть, насколько сложны эти запросы? Если ваша структура затрудняет запрос, попробуйте переустановить ее, пока не придете к структуре, с которой просто работать. Выполнение небольшой части этой предварительной работы по планированию/прототипу позволит значительно упростить вашу систему в будущем. – theabraham