如何在mongo中过滤子数组并返回文档

朱格努

我有两个系列EmployeeClient

Employee 架构有以下记录

{
    "_id": ObjectId("5a852dcd0290f7eca89e9a79"),
    "FirstName": "Nirav",
    "LastName": "Modi",
    "Gender": true,
    "Forms": [{
            "ClientId": ObjectId("5a8528ed0290f7eca89e9a5f"),
            "ProjectId": ObjectId("5a856fde0290f7eca89e9a88"),
            "FormId": ObjectId("5a62e561f6647f17f85e54c5")
        }]
}

Client 架构有以下记录

{
    "_id" : ObjectId("5a8528ed0290f7eca89e9a5f"),
    "CompanyName" : "PNB",
    "Projects" : [{
            "_id" : ObjectId("5a856ca70290f7eca89e9a7f"),
            "Name" : "House Loan",
            "Description" : "Get house load",
            "Forms" : []
        }, {
            "_id" : ObjectId("5a856fde0290f7eca89e9a88"),
            "Name" : "Car Loan",
            "Description" : "get car loan",
            "Forms" : [
                ObjectId("5a62e82299d9fe0a14a1ead5"),
                ObjectId("5a6eec263bf43426d4d31780"),
                ObjectId("5a62e561f6647f17f85e54c5")
            ]
        }
    ]
}

在我的系统中,员工被分配了要处理的表格。如您所见,员工架构包含Forms包含ClientId, ProjectId, 的字段FormId

表单可以在多个客户端用于多个项目。

当我获取数据时,我希望输出如下所示

{
    "_id": ObjectId("5a852dcd0290f7eca89e9a79"),
    "FirstName": "Aartik",
    "LastName": "Ladumor",
    "Gender": true,
    "Clients": [{
            "_id": ObjectId("5a8528ed0290f7eca89e9a5f"),
            "CompanyName": "PNB",
            "Projects": [{
                    "_id": ObjectId("5a856fde0290f7eca89e9a88"),
                    "Name": "Car Loan",
                    "Description": "get car loan",
                    "Forms": [
                        ObjectId("5a62e82299d9fe0a14a1ead5"),
                        ObjectId("5a6eec263bf43426d4d31780"),
                        ObjectId("5a62e561f6647f17f85e54c5")
                    ]
                }
            ]
        }
    ]
}

仅获取项目包含分配给员工的表单的客户。

为此,我进行如下聚合

db.Employees.aggregate([{
            $lookup: {
                from: "Clients",
                localField: "Forms.ClientId",
                foreignField: "_id",
                as: "Clients"
            }
        }, {
              filter projects array in matched client contains only
              projects that match Employee.Forms each elements 
              ProjectsId -> Client.Projects._id and
              FormId -> in Client.Projects.Forms array containing forms ObjectId 
        }
    ]).pretty() 
米克尔

您可以尝试以下聚合

db.employees.aggregate([
  { $unwind: "$Forms" },
  {
    $lookup: {
        from: "clients",
        localField: "Forms.ClientId",
        foreignField: "_id",
        as: "Clients"
    }
  },
  { $unwind: "$Clients" },
  { $unwind: "$Clients.Projects" },
  {
    $redact: {
      $cond: {
        if: { $eq: [ "$Forms.ProjectId", "$Clients.Projects._id" ] },
        then: "$$KEEP",
        else: "$$PRUNE"
      }
    } 
  },
  {
    $group: {
      _id: {
        _id: "$_id",
        ClientId: "$Clients._id"
      },
      FirstName: { $first: "$FirstName" },
      LastName: { $first: "$LastName" },
      Gender: { $first: "$Gender" },
      Client: { $first: "$Clients" },
      Projects: { $push: "$Clients.Projects" }
    }
  },
  {
    $group: {
      _id: "$_id._id",
      FirstName: { $first: "$FirstName" },
      LastName: { $first: "$LastName" },
      Gender: { $first: "$Gender" },
      Clients: { $push: {
        _id: "$Client._id",
        CompanyName: "$Client.CompanyName",
        Projects: "$Projects"
      } }
    }
  }
])

基本上你必须多次使用$unwind,因为你需要比较值而不是数组。所以 $lookup 合并了两个集合。然后您需要比较项目 ID,因此您必须再次 $unwind。要过滤掉不属于员工的项目,您可以使用$redact来比较两个字段。然后要得到两层嵌套数组,您应该使用 $group。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在项目位于数组中的地方返回mongo文档?

来自分类Dev

在返回文档的子文档中查找

来自分类Dev

如何在MongoDB中返回文档的ObjectId或_id?错误“ $ in需要一个数组”

来自分类Dev

如果只有子文档元素在嵌套数组中匹配,则返回文档

来自分类Dev

在 Mongoose 中过滤子文档数组并仅返回匹配的元素

来自分类Dev

如何过滤子文档数组?

来自分类Dev

在ArangoDB中返回文档之前,如何在文档中添加/删除属性?

来自分类Dev

如何在Mongo聚合中合并文档中的数组字段

来自分类Dev

如何在Mongodb中返回与给定条件匹配的子文档数组?

来自分类Dev

如何在Mongo DB中合并文档数组

来自分类Dev

如何在Mongo DB中合并数组和文档字段

来自分类Dev

如何在mongo中查找不包含数组元素的文档

来自分类Dev

如何在Lisp中返回子数组?

来自分类Dev

如何在Elastic Search中返回子文档的父ID?

来自分类Dev

如何确保我的聚合过滤掉mongo中过期的子文档?

来自分类Dev

如何在MongoDB中查找并插入子文档数组列表?

来自分类Dev

如何在MongoDB中查找并插入子文档数组列表?

来自分类Dev

如何在symfony2中将mongo文档与子文档映射

来自分类Dev

如何在Node Mongo DB mongoose Express App中同时创建文档和子文档

来自分类Dev

如何在JavaScript中的子数组数组和子数组数组之间进行过滤?

来自分类Dev

在MongoDB Shell中的文档数组中返回文档中特定列的值

来自分类Dev

如何在子文档的嵌套数组中更新子文档

来自分类Dev

mongodb:返回文档ID的数组

来自分类Dev

mongodb:返回文档ID的数组

来自分类Dev

返回文档匹配字段数组

来自分类Dev

为什么在Mongoose中查询子文档时没有返回文档?

来自分类Dev

如何过滤mongoDB中的子文档?

来自分类Dev

如何过滤mongoDB中的子文档?

来自分类Dev

Mongo find操作返回文档(对象)。如何访问这个?

Related 相关文章

  1. 1

    如何在项目位于数组中的地方返回mongo文档?

  2. 2

    在返回文档的子文档中查找

  3. 3

    如何在MongoDB中返回文档的ObjectId或_id?错误“ $ in需要一个数组”

  4. 4

    如果只有子文档元素在嵌套数组中匹配,则返回文档

  5. 5

    在 Mongoose 中过滤子文档数组并仅返回匹配的元素

  6. 6

    如何过滤子文档数组?

  7. 7

    在ArangoDB中返回文档之前,如何在文档中添加/删除属性?

  8. 8

    如何在Mongo聚合中合并文档中的数组字段

  9. 9

    如何在Mongodb中返回与给定条件匹配的子文档数组?

  10. 10

    如何在Mongo DB中合并文档数组

  11. 11

    如何在Mongo DB中合并数组和文档字段

  12. 12

    如何在mongo中查找不包含数组元素的文档

  13. 13

    如何在Lisp中返回子数组?

  14. 14

    如何在Elastic Search中返回子文档的父ID?

  15. 15

    如何确保我的聚合过滤掉mongo中过期的子文档?

  16. 16

    如何在MongoDB中查找并插入子文档数组列表?

  17. 17

    如何在MongoDB中查找并插入子文档数组列表?

  18. 18

    如何在symfony2中将mongo文档与子文档映射

  19. 19

    如何在Node Mongo DB mongoose Express App中同时创建文档和子文档

  20. 20

    如何在JavaScript中的子数组数组和子数组数组之间进行过滤?

  21. 21

    在MongoDB Shell中的文档数组中返回文档中特定列的值

  22. 22

    如何在子文档的嵌套数组中更新子文档

  23. 23

    mongodb:返回文档ID的数组

  24. 24

    mongodb:返回文档ID的数组

  25. 25

    返回文档匹配字段数组

  26. 26

    为什么在Mongoose中查询子文档时没有返回文档?

  27. 27

    如何过滤mongoDB中的子文档?

  28. 28

    如何过滤mongoDB中的子文档?

  29. 29

    Mongo find操作返回文档(对象)。如何访问这个?

热门标签

归档