簡體   English   中英

如何在 MongoDB 的聚合管道中重新組合(或合並)對象?

[英]How to regroup (or merge) objects in aggregation pipeline in MongoDB?

我目前有一個聚合管道:

db.getCollection('forms').aggregate([
    { $unwind: //unwind },
    { 
        $match: {
            //some matches
        }   
    },
    {
        $project: {
            //some projections
        }
    }, 
    {        
        //Finally, im grouping the results
        $group: {
            _id: {
                year: { $year: '$createdAt' },
                month: { $month: '$createdAt' },
                raceEthnicity: '$demographic.raceEthnicity'
            },
            count: { $sum: 1 },
    }
]

我目前的結果類似於:

[{
    "_id" : {
        "year" : 2020,
        "month" : 11,
        "raceEthnicity" : "Asian"
    },
    "count" : 1.0
},
{
    "_id" : {
        "year" : 2020,
        "month" : 11,
        "raceEthnicity" : "Multiracial"
    },
    "count" : 3.0
},
{
    "_id" : {
        "year" : 2020,
        "month" : 11,
        "raceEthnicity" : "White"
    },
    "count" : 3.0
},
{
    "_id" : {
        "year" : 2020,
        "month" : 10,
        "raceEthnicity" : "White"
    },
    "count" : 33.0
}]

有沒有辦法在管道上添加一個新階段以將同一年/月的結果“合並”到一個對象中? 我想實現以下目標:

{
    "_id" : {
        "year" : 2020,
        "month" : 11,
    },
    "Asian" : 1.0,
    "Multiracial": 3.0,
    "White": 1.0
},
{
    "_id" : {
        "year" : 2020,
        "month" : 10,
    },
    "White": 33
}

是否可以? 我怎樣才能做到這一點?

將此添加到您的聚合管道中。

db.collection.aggregate([
   { $set: { "data": { k: "$_id.raceEthnicity", v: "$count" } } },
   { $group: { _id: { year: "$_id.year", month: "$_id.month" }, data: { $push: "$data" } } },
   { $set: { "data": { $arrayToObject: "$data" } } },
   { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$data"] } } },
   { $unset: "data" }
])

與@wak786 的解決方案不同,您不需要在設計時了解所有種族。 它適用於任意種族。

將這些階段添加到您的管道中。

db.collection.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        "$mergeObjects": [
          "$$ROOT",
          {
            $arrayToObject: [
              [
                {
                  k: "$_id.raceEthnicity",
                  v: "$count"
                }
              ]
            ]
          }
        ]
      }
    }
  },
  {
    "$group": {
      "_id": {
        year: "$_id.year",
        month: "$_id.month",
        
      },
      "Asian": {
        "$sum": "$Asian"
      },
      "Multiracial": {
        "$sum": "$Multiracial"
      },
      "White": {
        "$sum": "$White"
      }
    }
  }
])

下面是 mongo 游樂場鏈接。 我已將您管道的當前結果作為查詢的輸入。

在這里試試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM