假设你有一个视频,每个视频都可以有评论,显然,这是一对多的关系。在Mongo中建模的最简单方法是使用嵌入式文档。但是,如果你有成千上万的评论,那就太可怕了。所以有两个选择:1.在视频文档的列表中存储评论ID1.在评论文档中存储视频ID第一个有一个问题,如果多个用户试图同时更新评论ID列表,可能会丢失一些数据和ID,所以不是最好的选择。第二个没有这个问题,但是由于必须在每个评论文档中查找视频id,性能受到了影响吗?那么解决这个问题的最好方法是什么呢?
bkhjykvo1#
在第一个选项中,您还需要查找以获取注解详细信息,因为您只存储注解ID。我建议使用第二种选择。一次查找并没有那么糟糕。即使你有性能问题,你也可以在评论集合中的video_id字段上添加索引来更好地执行。因此,查找可以是这样的:
db.videos.aggregate([ { "$match": { _id: 1 } }, { "$lookup": { "from": "comments", "localField": "_id", "foreignField": "video_id", "as": "comments" } } ])
Playground另一种选择是使用另一个查询获取注解,而不进行查找。您在一个查询中获得视频,并在另一个查询中获得视频评论。
1条答案
按热度按时间bkhjykvo1#
在第一个选项中,您还需要查找以获取注解详细信息,因为您只存储注解ID。
我建议使用第二种选择。一次查找并没有那么糟糕。即使你有性能问题,你也可以在评论集合中的video_id字段上添加索引来更好地执行。
因此,查找可以是这样的:
Playground
另一种选择是使用另一个查询获取注解,而不进行查找。您在一个查询中获得视频,并在另一个查询中获得视频评论。