MongoDB: хранение массива подписчиков внутри родительского объекта
Вопрос
У меня в настоящее время есть коллекция каналов, которая хранится как следующее:
{ "_id" : ObjectId("4f5d1012d48147e840000000"), "title" : "Testing", "description" : "hello!", "created" : "2012-03-11 20:50:26", "user" : ObjectId("4f5d0408d48147207f000000") }
.
Но я хотел бы, чтобы пользователи теперь смогут подписаться на этот канал.Я не думаю, что это достаточно важно, чтобы считаться собственной коллекцией, поэтому я хотел бы сохранить его как следующее:
{
"_id" : ObjectId("4f5d1012d48147e840000000"),
"title" : "Testing",
"description" : "hello!",
"subscriptions" :
{ "user" : ObjectId("USERIDHERE"), "created" : DATETIME },
{ "user" : ObjectId("USERIDHERE"), "created" : DATETIME },
{ "user" : ObjectId("USERIDHERE"), "created" : DATETIME }
"created" : "2012-03-11 20:50:26",
"user" : ObjectId("4f5d0408d48147207f000000")
}
.
Хотя я не могу, казаться головой, как чисто реализовать это в моем объекте лития.Будет ли мой свойство $story->vote
Array, который я нажимаю на каждое обновление?
Решение
ИМХО, как вы структурируете, что будет зависеть от того, как вы будете использовать подписки.
Причина, по которой я говорю, что это из-за производительности, касается линии с встроенным объектом Mongo VS VS связанными коллекциями. http://www.mongodb.org/display/docs/schema+design
вместо того, чтобы поместить идентификатор пользователя с подпиской, я бы предложил связывать идентификатор канала с пользователем (идентификатор канала в качестве встроенной коллекции в пользователю, который подписался).
Использование здесь имеет смысл, потому что при вытянете коллекцию пользователя (для их панели управления или панели мониторин или передней страницы и т. Д.) У вас будет список каналов для отображения.
Встраивание пользовательских идентификаторов в канале, имело бы только смысл, если вы планируете отображать каналы и показывать все пользователи, которые подписываются на них, вроде, как система чата в переполнении стека.
Разместить их в отдельной коллекции, будет иметь смысл, если вы планируете выполнять агрегации или будете иметь больше, чем в одной коллекции доступа к подпискам.