当你不能在MongoDB中使用嵌入式文档时,建模一对多关系的最佳方法是什么?

xqk2d5yq  于 2023-04-29  发布在  Go
关注(0)|答案(1)|浏览(134)

假设你有一个视频,每个视频都可以有评论,显然,这是一对多的关系。在Mongo中建模的最简单方法是使用嵌入式文档。但是,如果你有成千上万的评论,那就太可怕了。
所以有两个选择:
1.在视频文档的列表中存储评论ID
1.在评论文档中存储视频ID
第一个有一个问题,如果多个用户试图同时更新评论ID列表,可能会丢失一些数据和ID,所以不是最好的选择。
第二个没有这个问题,但是由于必须在每个评论文档中查找视频id,性能受到了影响吗?
那么解决这个问题的最好方法是什么呢?

bkhjykvo

bkhjykvo1#

在第一个选项中,您还需要查找以获取注解详细信息,因为您只存储注解ID。
我建议使用第二种选择。一次查找并没有那么糟糕。即使你有性能问题,你也可以在评论集合中的video_id字段上添加索引来更好地执行。
因此,查找可以是这样的:

db.videos.aggregate([
  {
    "$match": {
      _id: 1
    }
  },
  {
    "$lookup": {
      "from": "comments",
      "localField": "_id",
      "foreignField": "video_id",
      "as": "comments"
    }
  }
])

Playground
另一种选择是使用另一个查询获取注解,而不进行查找。您在一个查询中获得视频,并在另一个查询中获得视频评论。

相关问题