首页 > 解决方案 > 使用 $objectToArray 压缩一个文档中的数据

问题描述

我有多个订单日志文档,我正在尝试使用 $objectToArray 将它们压缩到一个文档中。下面是我想要弄清楚的集合和输出。我还包括我的查询,但它不压缩数据。

{
    "ordernumber": 21001,
    "ordername":"testorder1", 
    "status" : "Ordered",
    "modifiedat" : ISODate("2021-06-30T17:02:17.165Z")

},

{
    "ordernumber": 21001,
    "ordername":"testorder1", 
    "status" : "Order Received",
    "modifiedat" : ISODate("2021-07-01T03:57:47.533Z")

},

{
    "ordernumber": 21001,
    "ordername":"testorder1", 
    "status" : "Delivered",
    "modifiedat" : ISODate("2021-08-17T23:53:24.878Z")

},
{
    "ordernumber": 21002,
    "ordername":"testorder2", 
    "status" : "Ordered",
    "modifiedat" : ISODate("2021-07-17T23:53:24.878Z")

},
{
    "ordernumber": 21002,
    "ordername":"testorder2", 
    "status" : "Order Received",
    "modifiedat" : ISODate("2021-07-19T04:07:47.686Z")

},
{
    "ordernumber": 21002,
    "ordername":"testorder2", 
    "status" : "Order Cancelled",
    "modifiedat" : ISODate("2021-07-20T15:42:23.123Z")

},

每个订单号应包含一个文档输出中的所有日志:

 {
    "ordernumber": 21001,
    "ordername":"testorder1", 
    "orderlogs": [
        {
            "status" : "Ordered",
            "modifiedat" : ISODate("2021-06-30T17:02:17.165Z")
        },
        {
            "status" : "Order Received",
            "modifiedat" : ISODate("2021-07-01T03:57:47.533Z")
        },
        {
            "status" : "Delivered",
            "modifiedat" : ISODate("2021-08-17T23:53:24.878Z")
        }

    ]
},
{
    "ordernumber": 21002,
    "ordername":"testorder2", 
    "orderlogs": [
        {
            "status" : "Ordered",
            "modifiedat" : ISODate("2021-07-17T23:53:24.878Z")
        },
        {
            "status" : "Order Received",
            "modifiedat" : ISODate("2021-07-19T04:07:47.686Z")
        },
        {
            "status" : "Order Cancelled",
            "modifiedat" : ISODate("2021-07-20T15:42:23.123Z")
        }

    ]
},

我创建了一个查询,但每个文档只返回一个数组。(仍在多个文档中)

 {
    $project: {
    ordernumber: "$ordernumber",
     ordername:"$ordername",
    orderlogs: 
        {$objectToArray: {
        status:"$status",
        modifiedat: "$modifiedat"
                        } 
        }
}
}

标签: mongodbmongodb-query

解决方案


  1. $addFields- 将当前文档添加$$ROOT 到新字段中,orderlog.
  2. $project- 不显示_id, ordernumber, ordernamefororderlog
  3. $groupordernumber- 按和分组ordername
  4. $project- 显示ordernumber, ordername,orderlog字段
db.collection.aggregate([
  {
    "$addFields": {
      "orderlog": "$$ROOT"
    }
  },
  {
    $project: {
      "orderlog": {
        "_id": 0,
        "ordernumber": 0,
        "ordername": 0
      }
    }
  },
  {
    $group: {
      _id: {
        ordernumber: "$ordernumber",
        ordername: "$ordername"
      },
      orderlogs: {
        $push: "$orderlog"
      }
    }
  },
  {
    $project: {
      _id: 0,
      ordernumber: "$_id.ordernumber",
      ordername: "$_id.ordername",
      orderlogs: "$orderlogs"
    }
  }
])

示例 Mongo Playground


推荐阅读