我是 mongodb 的新手,也许这是一个微不足道的问题。我有两个 mongodb 集合:user
和post
. 用户可以创建和关注多个帖子,帖子按最后修改日期排序。可能有大量用户关注特定帖子,因此我不想在每个帖子文档中保留关注者列表。另一方面,一个用户可能不会关注超过几千个帖子,所以我决定在每个用户文档中保留关注帖子的 objectid 列表。
为了能够快速列出给定用户的 50 个最近修改的帖子,我选择将该last_updated_at
字段与帖子 objectid 一起保留。
该post
文件相当基本:
{
"_id" : ObjectId("5163deebe4d809d55d27e847"),
"title" : "All about music"
"comments": [...]
...
}
该user
文档如下所示:
{
"_id": ObjectId("5163deebe4d809d55d27e846"),
"posts": [{
"post": ObjectId("5163deebe4d809d55d27e847"),
"last_updated_at": ISODate("2013-04-09T11:27:07.184Z")
}, {
"post": ObjectId("5163deebe4d809d55d27e847"),
"last_updated_at": ISODate("2013-04-09T11:27:07.187Z")
}]
...
}
当用户创建或关注帖子时,我可以简单地$push
将帖子的ObjectId
和到用户文档中列表last_updated_at
的末尾。posts
当帖子被修改时(例如,当评论被添加到帖子中时),我last_updated_at
会在所有关注者的用户文档中更新该帖子的字段。这很重,但我不知道如何避免它。
当我想获取用户最近更新的 50 个帖子的列表时,不幸的是,我需要获取关注的帖子的整个列表,然后last_updated_at
在内存中排序,然后只保留前 50 个帖子。
因此,我尝试更改实现以在修改帖子时重新排序列表:我$push
将它放到列表的末尾,并且$pull
它从任何位置开始。由于这是一个两步程序,因此存在竞争条件,我可能会在列表中获得两次相同的帖子。有没有更好的方法来维护 mongodb 中的排序数组?