【问题标题】:MongoDB: Looking for advice on designing schema for improving query efficiencyMongoDB:寻找有关设计模式以提高查询效率的建议
【发布时间】:2021-09-03 08:18:57
【问题描述】:

我对 MongoDB 还很陌生,在我承诺走这条路之前,我正在寻找有关设计模式的建议。我正在开发一个协作文档系统,用户可以在其中创建文档并邀请其他用户进行协作,就像 Google 文档一样。

有两个集合。第一个存储文档,第二个存储协作者列表。当用户创建一个新文档时,他们会为该文档分配一个协作者列表。在最简单的形式中,架构看起来像这样

Document 模式包含一些数据,但它还维护对 Collaborators 集合中文档的引用

文档模型

  {
       ....
      collaborators: ObjectId; // e.g. 0x507f1f77bcf86cd799439011
    } 

Collaborators 集合包含包含协作者角色数组的文档。

合作者模型

{
     _id: 0x507f1f77bcf86cd799439011; // refererenced by Document model
    collaborators: [
        {userId: 1, role: "editor"},
        {userId: 2, role: "commenter}
   ]
}

我将有一个 API 来获取登录用户的 userId 在文档引用的协作者列表中的所有文档。如果没有太多编写高效查询的经验,我认为两步查找会起作用,但效率不会很高。

Step 1 → 查找所有包含userId的合作者列表,并获取他们的_id字段

第 2 步 → 查找所有具有包含第 1 步中找到的值之一的合作者字段的文档

有没有更有效的方法来构造这个查询,特别是如果用户经常获取这个列表?

如果我应该以某种方式重新设计架构以提高查找效率,我想知道。

如果相关,我正在使用猫鼬客户端。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    我意识到使用 MongoDB 聚合框架是我所需要的。我能够使用$lookup$match 阶段来实现我想要的。鉴于 $lookup 将执行左连接,仍然不确定这有多昂贵。

    如果有人想看,这里有一个例子。 https://mongoplayground.net/p/RPheBZESC0H

    【讨论】:

    • "collaborators.list.userId" 是和数组。并且 "collaborators.list.userId":1 将传递所有列表,只要 1 userid=1 ,如果您只想保留 1 ,则必须过滤数组。只要您在连接字段中有索引,$lookup 就会非常快。
    猜你喜欢
    • 2013-06-12
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多