Mongodb-按键对数组进行分组

白蚁群

我在多个文档中有一个数组字段(包含对象),我想将数组合并为一个数组并按对象键对数组进行分组。我已经设法对数组进行分组,但我不知道如何对数据进行分组。请参阅我在下面尝试的代码

const test = await salesModel.aggregate([
            { $unwind: "$items" },
            {
                $group: {
                    _id: 0,
                    data: { $addToSet: '$items' }
                },
            }
        ])

查询结果:

{
  _id: 0,
  data: [
    {
      _id: 61435b3c0f773abaf77a367e,
      price: 3000,
      type: 'service',
      sellerId: 61307abca667678553be81cb,
    },
    {
      _id: 613115808330be818abaa613,
      price: 788,
      type: 'product',
      sellerId: 61307abca667678553be81cb,
    },
    {
      _id: 61307c1ea667676078be81cc,
      price: 1200,
      type: 'product',
      sellerId: 61307abca667678553be81cb,
    }
  ]
}

现在我想按对象键data.sellerId和总价对数据数组进行分组

期望输出:

{
  data: [
    {
      sumPrice: 788,
      sellerId: 613115808330be818abaa613,
    },
    {
      sumPrice: 1200,
      sellerId: 61307abca667678553be81cb,
    }
  ]
}
Yong Shun

使用当前查询和结果扩展:

  1. $unwind: 将数组字段解构为多个文档。
  2. $group: Group by data.sellerIdto sum ( $sum) for data.price
  3. $group: Group by 0 with$addToSet将多个文档合并为一个文档data

MongoDB聚合查询

db.collection.aggregate([
  {
    $unwind: "$data"
  },
  {
    $group: {
      _id: {
        sellerId: "$data.sellerId"
      },
      "sumPrice": {
        $sum: "$data.price"
      }
    }
  },
  {
    "$group": {
      "_id": 0,
      "data": {
        $addToSet: {
          "sellerId": "$_id.sellerId",
          "sumPrice": "$sumPrice"
        }
      }
    }
  }
])

示例 Mongo Playground

输出

[
  {
    "_id": 0,
    "data": [
      {
        "sellerId": ObjectId("61307abca667678553be81cb"),
        "sumPrice": 4988
      }
    ]
  }
]

如果您想重新编写查询,这里是带有示例输入的查询。

输入

[
  {
    items: [
      {
        _id: ObjectId("61435b3c0f773abaf77a367e"),
        price: 3000,
        type: "service",
        sellerId: ObjectId("61307abca667678553be81cb"),
        
      },
      {
        _id: ObjectId("613115808330be818abaa613"),
        price: 788,
        type: "product",
        sellerId: ObjectId("61307abca667678553be81cb"),
        
      },
      {
        _id: ObjectId("61307c1ea667676078be81cc"),
        price: 1200,
        type: "product",
        sellerId: ObjectId("61307abca667678553be81cb"),
        
      }
    ]
  }
]

Mongo聚合查询

db.collection.aggregate([
  {
    $unwind: "$items"
  },
  {
    $group: {
      _id: {
        sellerId: "$items.sellerId"
      },
      "sumPrice": {
        $sum: "$items.price"
      }
    }
  },
  {
    "$group": {
      "_id": 0,
      "data": {
        $addToSet: {
          "sellerId": "$_id.sellerId",
          "sumPrice": "$sumPrice"
        }
      }
    }
  }
])

Mongo Playground 示例 2

输出

[
  {
    "_id": 0,
    "data": [
      {
        "sellerId": ObjectId("61307abca667678553be81cb"),
        "sumPrice": 4988
      }
    ]
  }
]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

mongodb:每n个元素对数组元素进行分组

分组后如何对数组值进行排序-MongoDB

如何基于mongodb中的另一个数组值对数组进行分组

如何使用mongodb对数据进行分组?

在Spring Data MongoDB Aggregation中对数组进行分组后,Count操作返回1而不是0

MongoDB聚合,对数组中的每一项进行计数并按项分组

MongoDB:使用组对数组进行计数

按键中的字符串对数组值进行分组?

Spark:按键对数组中的行进行分组

如何在数组mongodb下的子文档中使用日期字符串对数据进行分组

MongoDB 分组并按键排序

mongodb:对数组的内容进行计数和排序

在MongoDB文档中对数组元素进行排序?

MongoDB按名称对数组中的项目进行计数

MongoDB:对数组元素进行匹配和排序?

在mongodb中对数组内的元素进行计数

使用 $lookup 对数组中的字段进行 MongoDB 聚合

按出现次数对数组进行排序 mongodb

按键对地图/结构进行分组,然后对数组的关联值求和

如何在 PHP Laravel Builder 查询中按键对数组进行分组

子Mongodb分组数组

PHP。按键对数组元素进行排序

Symfony / TWIG,按键对数组进行排序

按 MongoDB 中的键对子文档数组进行分组

如何使用MongoDB根据数组元素对记录进行分组

在mongoDB中使用数组项对查询进行分组以计算总和

Mongodb 元素数组必须基于相同的元素进行分组

MongoDB我们如何按字段值对数据进行分组

如何对数据进行分组并在mongodb中获取和获取所有字段