我已经搜索过,并没有找到这个常见问题的确切答案。
我想向用户展示新的/未读的帖子,例如他们获得的主题列表包含未评论的帖子。 如果用户决定并打开任何该主题,则会自动将其标记为已读,并且当他点击未读帖子时不会再次显示在该列表中。此外,还可以将所有内容标记为已读。 我在考虑可能只显示过去30天的未读帖子,所以数据不会那么大。
明显且最好的解决方案是将这个内部对象嵌入到数组中,每个数组都会有特定主题的最后一个视图的用户ID和时间戳,然后我只是比较线程中最后一个帖子的时间戳和最后一个视图的时间戳。那个线程由用户提供。 然后,只需要2-3个查询就可以向用户显示结果。
所以例如它看起来像这样:
{
_id: uniqueObjectid,
id: topic_id,
topic: topic of the thread,
last_update: timestamp of last reply to that topic,
reads: [
{id: userid, last_view: timestamp of last view on this topic by user},
...
]
}
我会从此集合中删除last_update字段超过30天的所有线程。
显示用户的未读帖子非常简单,只需将last_update与last_view比较某些用户ID即可。
但它并不是一个好的解决方案,从我读过mongodb中实现数组的方式来看,这个解决方案非常慢。想象一下,对于1000个用户的最后一个主题视图,它意味着1000个索引数组元素。 所以它不能在数组中完成。
来自MongoDB的Asya描述了为什么不应该使用大型嵌入式阵列link
我很难想到解决这个问题的任何其他有效方法。