【问题标题】:How to group documents into an array of other model in mongodb如何将文档分组到mongodb中的其他模型数组中
【发布时间】:2021-05-05 21:19:04
【问题描述】:

由于我是 mongodbnodejs 的新手,我被困在这里,我有一个索赔集合,每个索赔都有一个 orderId 作为字段,我想做的是按订单 ID 对所有索赔进行分组并显示他们在一系列订单中,例如我有这些声明:

[
    {
        message: "claim1",
        orderId: 123456789
    },
    {
        message: "claim2",
        orderId: 0000000
    },
    {
        message: "claim3",
        orderId: 123456789
    },
    {
        message: "claim4",
        orderId: 0000000
    }
]

我想要做的是按顺序对这些索赔进行分组,我发现我可以在互联网上搜索时使用 $group 来完成,但困难的部分是我希望结果是一系列订单和每个案例这个数组包含一些订单字段和这个订单的声明数组。这就是我想要的结果:

[
    {
        orderId: 123456789,
        orderNumber: "OrderNumber"
        // i want to get this from the order document in the database,
        claims: [
            {
                message: "claim1"
            },
            {
                message: "claim2"
            }
        ]
    },
    {
        orderId: 00000000,
        orderNumber: "OrderNumber"
        // i want to get this from the order document in the database,
        claims: [
            {
                message: "claim2"
            },
            {
                message: "claim4"
            }
        ]
    }
]

这是一个订单示例:

{
 _id:123456789,
  orderNumber:112,
  orderPrice:14,
  created_at: 2020-04-29T16:34:48.522+00:00
  updated_at: 2020-05-01T14:03:04.844+00:00
}

我一直在寻找解决方案,但找不到任何解决方案,我开始认为 mongodb 聚合不可能做到这一点。谢谢你的帮助

【问题讨论】:

  • 使用$lookup 可以轻松完成,您应该将order 架构添加到您的问题中,因为它是回答所必需的。
  • 感谢您的回答@TomSlabbaert 我在问题中添加了订单模式

标签: node.js mongodb aggregation-framework grouping


【解决方案1】:

所以我们的策略是首先在orderId$group 收集所有索赔,然后我们将$lookup 订单号,如下所示:

db.collection.aggregate([
  {
    $group: {
      _id: "$orderId",
      claims: {
        $push: {
          message: "$message"
        }
      }
    }
  },
  {
    "$lookup": {
      "from": "orders",
      "localField": "_id",
      "foreignField": "_id",
      "as": "orders"
    }
  },
  {
    $unwind: "$orders"
  },
  {
    $project: {
      _id: 0,
      claims: 1,
      orderId: "$_id",
      orderNumber: "$orders.orderNumber"
    }
  }
])

【讨论】:

  • 非常感谢您,先生,您的回答是我正在寻找的,但是如果我想稍后添加一些字段来声明架构,所以我不想只显示消息,我该如何显示所有文档我应该手动推送所有字段吗?
  • 是的,当您$group 时,您“丢失”了所有未手动指定的字段。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2014-07-29
  • 2017-11-24
  • 1970-01-01
  • 2019-03-04
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多