MongoDB: Хранение массива подписчиков внутри родительского объекта - PullRequest
1 голос
/ 12 марта 2012

У меня сейчас есть коллекция каналов, которая хранится в следующем формате:

{ "_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 массивом, к которому я добавляю каждое обновление?

1 Ответ

4 голосов
/ 13 марта 2012

ИМХО, как вы будете структурироваться, будет зависеть от того, как вы будете использовать подписки.

Причина, по которой я говорю это, из-за проблем с производительностью по сравнению со встроенными монго-объектами против связанных коллекций.http://www.mongodb.org/display/DOCS/Schema+Design

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

Использование здесь имеет смысл, потому что когда вы извлекаете коллекцию пользователя (для его панели управления, приборной панели или главной страницы и т. Д.), У вас будет список каналов для отображения.

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

Размещение ихв отдельную коллекцию имеет смысл, если вы планируете выполнять агрегацию или у вас будет более одной коллекции для доступа к подпискам.

...