【问题标题】:Get Count of specific field mongodb获取特定字段的计数 mongodb
【发布时间】:2019-05-11 06:36:43
【问题描述】:

我正在使用以下查询从用户和项目集合中获取组合数据:

db.collection.aggregate([
 { 
   "$group": {
     "_id": "$userId",
     "projectId": { "$push": "$projectId" }
    }
 },
 { 
   "$lookup": {
     "from": "users",
     "let": { "userId": "$_id" },
     "pipeline": [
        { "$match": { "$expr": { "$eq": [ "$_id", "$$userId" ] }}},
        { "$project": { "firstName": 1 }}
      ],
     "as": "user"
    }
 },
 { "$unwind": "$user" },
 {
   "$lookup": {
     "from": "projects",
     "let": { "projectId": "$projectId" },
     "pipeline": [
        { "$match": { "$expr": { "$in": [ "$_id", "$$projectId" ] }}},
        { "$project": { "projectName": 1 }}
      ],
     "as": "projects"
    }
 }
])

结果如下:

[
  {
    "_id": "5c0a29e597e71a0d28b910aa",
    "projectId": [
        "5c0a2a8897e71a0d28b910ac",
        "5c0a4083753a321c6c4ee024"
    ],
    "user": {
        "_id": "5c0a29e597e71a0d28b910aa",
        "firstName": "Amit"
    },
    "projects": [
        {
            "_id": "5c0a2a8897e71a0d28b910ac",
            "projectName": "LN-PM"
        },
        {
            "_id": "5c0a4083753a321c6c4ee024",
            "projectName": "fallbrook winery"
        }
    ]
  },
  {
    "_id": "5c0a29c697e71a0d28b910a9",
    "projectId": [
        "5c0a4083753a321c6c4ee024"
    ],
    "user": {
        "_id": "5c0a29c697e71a0d28b910a9",
        "firstName": "Rajat"
    },
    "projects": [
        {
            "_id": "5c0a4083753a321c6c4ee024",
            "projectName": "fallbrook winery"
        }
    ]
  }
]

现在我有另一个表“工作表”,并希望在项目数组中包含 小时 字段,该字段将通过指定项目数组中的 _id 从工作表表中计算出来。它将在工作表中找到,并且小时数将增加此_id 在工作表中的次数。以下是我的工作表集合:

{
  "_id" : ObjectId("5c0a4efa91b5021228681f7a"),
  "projectId" : ObjectId("5c0a4083753a321c6c4ee024"),
  "hours" : 8,
  "userId" : ObjectId("5c0a29c697e71a0d28b910a9"),
  "__v" : 0 
}

{
 "_id" : ObjectId("5c0a4f4191b5021228681f7c"),
  "projectId" : ObjectId("5c0a2a8897e71a0d28b910ac"),
  "hours" : 6,
  "userId" : ObjectId("5c0a29e597e71a0d28b910aa"),
 "__v" : 0
}

结果如下所示:

{
    "_id": "5c0a29c697e71a0d28b910a9",
    "projectId": [
        "5c0a4083753a321c6c4ee024"
    ],
    "user": {
        "_id": "5c0a29c697e71a0d28b910a9",
        "firstName": "Rajat"
    },
    "projects": [
        {
            "_id": "5c0a4083753a321c6c4ee024",
            "projectName": "fallbrook winery",
             "hours":8
        }
    ]
}

【问题讨论】:

  • 你能把workSheets收藏中的相关文件贴出来吗?
  • 当然,我正在更新我的问题。
  • 我知道你会有关于上面的问题,因为上面写的不是正确的。请随时向我提问。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

你可以使用下面的聚合

$lookup 3.6 嵌套语法允许您加入$lookup 管道内的嵌套集合。您可以在嵌套的$lookup 管道内执行所有聚合

db.collection.aggregate([
  { "$group": {
    "_id": "$userId",
    "projectId": { "$push": "$projectId" }
  }},
  { "$lookup": {
    "from": "users",
    "let": { "userId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$_id", "$$userId" ] }}},
      { "$project": { "firstName": 1 }}
    ],
    "as": "user"
  }},
  { "$unwind": "$user" },
  { "$lookup": {
    "from": "projects",
    "let": { "projectId": "$projectId" },
    "pipeline": [
      { "$match": { "$expr": { "$in": [ "$_id", "$$projectId" ] }}},
      { "$lookup": {
        "from": "worksheets",
        "let": { "projectId": "$_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": [ "$projectId", "$$projectId" ] }}},
          { "$group": {
            "_id": "$projectId",
            "totalHours": { "$sum": "$hours" }
          }}
        ],
        "as": "workHours"
      }}
      { "$project": {
        "projectName": 1,
        "hours": { "$arrayElemAt": ["$workHours.totalHours", 0] }
      }}
    ],
    "as": "projects"
  }}
])

【讨论】:

  • 我问的你得到了吗?
  • @test 你测试了吗?
  • 你能告诉我,为什么我们在每个查询中都使用管道?
  • pipeline 允许您加入该集合。如果您熟悉聚合,第一个表达式即db.collection.aggregate([...]) 是您开始聚合的第一个管道[ ]$lookup pipeline 让您可以使用pipeline 表达式加入该集合。 let 是您可以在父集合中的 pipeline 中使用的变量。
猜你喜欢
  • 2021-11-09
  • 2023-01-07
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2019-08-12
  • 2020-10-16
  • 1970-01-01
  • 2022-12-16
相关资源
最近更新 更多