【问题标题】:Return multiple objects with $group(aggregation)使用 $group(aggregation) 返回多个对象
【发布时间】:2020-01-13 14:33:36
【问题描述】:

我有一个类似这样的集合:

[
  {
    "_id":1,
    "name":"breakfast",
    "time":"10.00"
  },
  {
    "_id":3,
    "name":"lunch",
    "time":"12.07"
  },
  {
    "_id":2,
    "name":"breakfast",
    "time":"10.10"
  },
  {
    "_id":4,
    "name":"lunch",
    "time":"12.45"
  }
]

我想聚合成这样的东西:

{
  "breakfast":[
    {
      "_id":1,
      "name":"breakfast",
      "time":"10.00"
    },
    {
      "_id":2,
      "name":"breakfast",
      "time":"10.10"
    }
  ],
  "lunch":[
    {
      "_id":3,
      "name":"lunch",
      "time":"12.07"
    },
    {
      "_id":4,
      "name":"lunch",
      "time":"12.45"
    }
  ]
}                

我只设法将它们分组,但我无法根据餐点将主餐更改为早餐或午餐。名称(组名)

$group: {
    _id: { meal: '$meal.name' },
    meals: { $push: '$meal' },
}

使用上面的代码,我设法产生了下面的输出。我唯一的挑战是将密钥meals 更改为早餐或午餐,如上文子组中所述。

{
  "meals":[
    {
      "_id":1,
      "name":"breakfast",
      "time":"10.00"
    },
    {
      "_id":2,
      "name":"breakfast",
      "time":"10.10"
    }
  ],
  "meals":[
    {
      "_id":3,
      "name":"lunch",
      "time":"12.07"
    },
    {
      "_id":4,
      "name":"lunch",
      "time":"12.45"
    }
  ]
}

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    在这里你可以得到你的答案。
    在“分组”添加到数组之后,您同样可以通过 "name" 分组键将所有内容 $push 到数组中,然后使用 $arrayToObject 转换为 $replaceRoot 中的文档键:

    db.collection.aggregate([
      { "$group": {
        "_id": "$name",
        "data": { "$push": "$$ROOT" }
      }},
      { "$group": {
        "_id": null,
        "data": {
          "$push": {
            "k": "$_id",
            "v": "$data"
          }
        }
      }},
      { "$replaceRoot": {
        "newRoot": { "$arrayToObject": "$data" }
      }}
    ])
    

    输出

    [
      {
        "breakfast": [
          {
            "_id": 1,
            "name": "breakfast",
            "time": "10.00"
          },
          {
            "_id": 2,
            "name": "breakfast",
            "time": "10.10"
          }
        ],
        "lunch": [
          {
            "_id": 3,
            "name": "lunch",
            "time": "12.07"
          },
          {
            "_id": 4,
            "name": "lunch",
            "time": "12.45"
          }
        ]
      }
    ]
    

    您可以在这个LINK

    中查看上述查询的结果

    【讨论】:

    • 精确和最优的方法:)
    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 2012-04-18
    • 2020-11-23
    • 1970-01-01
    • 2013-06-03
    • 2018-01-30
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多