MongoDB:在父对象中存储订阅者数组

Gar*_*nay 2 php mongodb lithium

我目前有一个 Channels 集合,存储如下:

{ "_id" : ObjectId("4f5d1012d48147e840000000"), "title" : "Testing", "description" : "hello!", "created" : "2012-03-11 20:50:26", "user" : ObjectId("4f5d0408d48147207f000000") }
Run Code Online (Sandbox Code Playgroud)

但我希望用户现在能够订阅这个频道。我认为这还不够重要,不足以被视为自己的收藏,所以我想将其存储为以下内容:

{ 
    "_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") 
}
Run Code Online (Sandbox Code Playgroud)

尽管我似乎无法弄清楚如何在我的锂对象中干净地实现这一点。我的$story->vote属性是否是一个在每次更新时推送到的数组?

小智 5

恕我直言,您如何构建它取决于您如何使用订阅。

我这么说的原因是因为嵌入式 mongo 对象与链接集合的性能问题。http://www.mongodb.org/display/DOCS/Schema+Design

我建议不要将用户 ID 与订阅放在一起,而是将频道 ID 与用户链接起来(频道 ID 作为订阅用户中的嵌入集合)。

这里的用法是有意义的,因为当您拉取用户的集合(对于他们的控制面板或仪表板或首页等...)时,您将有要显示的频道列表。

仅当您计划显示频道并显示订阅它们的所有用户时,将用户 ID 嵌入频道才有意义,有点像堆栈溢出中的聊天系统。

如果您计划进行聚合或者将有多个集合访问订阅,则将它们放入单独的集合中是有意义的。