【问题标题】:How to Populate data using Mongodb Aggregate framework?如何使用 Mongodb 聚合框架填充数据?
【发布时间】:2021-04-25 07:24:49
【问题描述】:

我有一个来自 previous question 的当前 MongoDB Aggregate 框架管道,但我无法添加填充查询以按 id 获取用户配置文件。

我的代码在下面

Product.aggregate([
      {
        $group: {
          _id: {
            hub: "$hub",
            status: "$productStatus",
          },
          count: { $sum: 1 },
        },
      },
      {
        $group: {
          _id: "$_id.hub",
          counts: {
            $push: {
              k: "$_id.status",
              v: "$count",
            },
          },
        },
      },
      {
        $group: {
          _id: null,
          counts: {
            $push: {
              k: { $toString: "$_id" },
              v: "$counts",
            },
          },
        },
      },

      {
        $addFields: {
          counts: {
            $map: {
              input: "$counts",
              in: {
                $mergeObjects: [
                  "$$this",
                  { v: { $arrayToObject: "$$this.v" } },
                ],
              },
            },
          },
        },
      },
      {
        $replaceRoot: {
          newRoot: { $arrayToObject: "$counts" },
        },
      },
    ]);

得到如下结果

[
  {
    "5fe75679e6f7a62ddaf5b2e9": {
      "in progress": 5,
      "Cancelled": 4,
      "return": 1,
      "on the way": 3,
      "pending": 13,
      "Delivered": 4
    }
  }
]

预期输出

我需要使用 hubId "5fe75679e6f7a62ddaf5b2e9" 从用户集合中获取用户信息,并期望得到下面表格的最终结果

[
    {
        "hub": {
            "photo": "avatar.jpg",
            "_id": "5fe75679e6f7a62ddaf5b2e9",
            "name": "Dhaka Branch",
            "phone": "34534543"
        },
        "statusCounts": {
            "in progress": 5,
            "Cancelled": 4,
            "return": 1,
            "on the way": 3,
            "pending": 13,
            "Delivered": 4
        }
    }
]

第一个 id 是用户 id,在用户集合中可用。

【问题讨论】:

  • 要使用数据填充集合,您需要对 3 件事有一个清晰的认识。 (1) 数据来源,(2) 目标。输出集合文档是什么样的?什么是/是数据源?最后,(3)你想用什么逻辑/过程来得到结果。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

您需要稍微调整一下您的聚合管道,并包括新的管道阶段,如填充 枢纽

Product.aggregate([
    {  "$group": {
            "_id": {
                "hubId": "$hubId",
                "status": "$productStatus"
            },
            "count": { "$sum": 1 }
    } },
    { "$group": {
        "_id": "$_id.hubId",
        "statusCounts": {
            "$push": {
                "k": "$_id.status",
                "v": "$count"
            }
        }
    } },
    { "$lookup": {
        "fron": "users",
        "localField": "_id",
        "foreignField": "_id",
        "as": "user"
    } },
    { "$project": {
        "user": { "$arrayElemAt": ["$user", 0] },
        // "hub": { "$first": "$hub" },
        "statusCounts": { "$arrayToObject": "$statusCounts" }      
    } }
])

要仅投影用户配置文件中的某些字段,您可以更新您的 $lookup 管道以具有表单

{ "$lookup": {
    "from": "users",
    "let": { "userId": "$_id" },
    "pipeline": [
        { "$match": {
            "$expr": { "$eq": ["$_id", "$$userId"] }
        } },
        { "$project": { 
            "name": 1,
            "phone": 1, 
            "photo": 1 
        } }
    ],
    "as": "user"
} }

【讨论】:

  • 您好 Chridam,再次感谢您的宝贵时间。这次我收到错误 MongoError: $arrayToObject requires an object keys of 'k' 和 'v'。发现不正确的键数:1
  • 终于成功了,谢谢Chirdam,你是老板
猜你喜欢
  • 2020-04-08
  • 2021-10-22
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多