【问题标题】:MongoDB List of SubdocumentsMongoDB 子文档列表
【发布时间】:2020-08-04 15:52:49
【问题描述】:

我有一个关于子文档的问题。假设我有一个这样的用户数据库:

db.users.insertMany([
{
    username: "test",
    projectA: [
        {
            tags: ['1234', '23454']
        }

    ]
},

{
    username: "test2",
    projectA: [
        {
            tags: ['1dfdfsdf', '234dfdfdf54']
        }

    ]
},
]);

在用户文档下方,我有项目的子文档。比方说,其中一个项目被称为“ProjectA”。在这个文档下我存储了项目的数据,在我的例子中是一些标签。

我对整个 User-Model 没有用处,因为它可能包含大量数据。我想要的是一个包含用户和项目A下数据库中所有标签的列表。

我使用 NodeJS 和猫鼬来获取数据。我该怎么做?

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    您可以使用$match 进行过滤,使用$project 获取数据子集:

    db.collection.aggregate([
        { $match: { username: "test" } },
        { $project: {"projectA.tags": 1} }
    ])
    

    Mongo Playground

    【讨论】:

      【解决方案2】:

      MongoDB 和 Mongoose 没有完全符合您需要的内置功能。 查询数据库后,您必须编写自定义代码来循环返回的文档数组。

      类似这样的:

      
      db.collection.find({})
      .lean()
      .sort({data:1})
      .limit(10)
      .then(data=>{
      
      //Process your data here using custom codes
      
      for (let index = 0; index < data.length; index++) {
          const element = array[index].ProjectA.tags;
          console.log(element);
          }
      })
      
      .catch(err=>console.log(err));
      
      

      这里我假设项目文件总是被称为ProjectA,标签文件总是被称为tags

      【讨论】:

      • 这听起来像是一个真正的性能问题,尤其是当我想获取例如最近添加的 10 个标签时,我每​​次都必须遍历整个数据库。在 MySQL 中,这将是一个带有排序和限制的简单查询。或者也许整个数据库设计应该不同?可以说,有不同的项目和用户。一个用户可以参与不同的项目。我有一个页面,其中有一些关于该项目的统计数据。例如带有标签的列表。设计数据库的最佳方法是什么。我想到的每一种方式都朝着基于表的关系数据库的方向发展。
      • 您也可以在 MongoDB 中进行限制和排序。 $or$and 等其他运算符也可用。我建议你查看 MongoDB 文档。
      猜你喜欢
      • 1970-01-01
      • 2016-04-26
      • 2020-06-07
      • 2013-02-13
      • 2014-09-28
      • 2023-03-28
      • 1970-01-01
      • 2014-09-26
      • 2011-08-04
      相关资源
      最近更新 更多