如何在MongoDB中按数据范围对订单进行分组?

如何在MongoDB中按数据范围对订单进行分组?,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,假设我有一个这样的收藏: [ { "_id": ObjectId("5e3dd3d57f8bc30a7513e843"), "deleted": true, "date": "01/01/2020" "total": 3 }, { "_id": ObjectId("5e3dd3e97f8bc30a7513e99b"), "date": "02/01/2020", "deleted": false, "total": 11

假设我有一个这样的收藏:

[
  {
    "_id": ObjectId("5e3dd3d57f8bc30a7513e843"),
    "deleted": true,
    "date": "01/01/2020"
    "total": 3
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a7513e99b"),
    "date": "02/01/2020",
    "deleted": false,
    "total": 11
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75137635"),
    "date": "15/02/2020",
    "deleted": false,
    "total": 5
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75131725"),
    "date": "18/02/2020",
    "deleted": false,
    "total": 7
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75131725"),
    "date": "03/03/2020",
    "deleted": false,
    "total": 9
  }
]
{
"january": [order1, order2],
"february": [order3, order4],
"march": [order5]
}
db.sales.aggregate( [
   { $group: { date: { "$gte": new Date(req.query.minDate), "$lte": new Date(req.query.maxDate) }, mergedOrders: { ?? } } }
])
我需要按范围合并这些订单,以接收如下内容:

[
  {
    "_id": ObjectId("5e3dd3d57f8bc30a7513e843"),
    "deleted": true,
    "date": "01/01/2020"
    "total": 3
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a7513e99b"),
    "date": "02/01/2020",
    "deleted": false,
    "total": 11
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75137635"),
    "date": "15/02/2020",
    "deleted": false,
    "total": 5
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75131725"),
    "date": "18/02/2020",
    "deleted": false,
    "total": 7
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75131725"),
    "date": "03/03/2020",
    "deleted": false,
    "total": 9
  }
]
{
"january": [order1, order2],
"february": [order3, order4],
"march": [order5]
}
db.sales.aggregate( [
   { $group: { date: { "$gte": new Date(req.query.minDate), "$lte": new Date(req.query.maxDate) }, mergedOrders: { ?? } } }
])
当然,我不需要“一月、二月”等特别的词,只需要一些让我按数据范围分组的词。大概是这样的:

[
  {
    "_id": ObjectId("5e3dd3d57f8bc30a7513e843"),
    "deleted": true,
    "date": "01/01/2020"
    "total": 3
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a7513e99b"),
    "date": "02/01/2020",
    "deleted": false,
    "total": 11
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75137635"),
    "date": "15/02/2020",
    "deleted": false,
    "total": 5
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75131725"),
    "date": "18/02/2020",
    "deleted": false,
    "total": 7
  },
  {
    "_id": ObjectId("5e3dd3e97f8bc30a75131725"),
    "date": "03/03/2020",
    "deleted": false,
    "total": 9
  }
]
{
"january": [order1, order2],
"february": [order3, order4],
"march": [order5]
}
db.sales.aggregate( [
   { $group: { date: { "$gte": new Date(req.query.minDate), "$lte": new Date(req.query.maxDate) }, mergedOrders: { ?? } } }
])
它不靠近有效的组聚合调用


那么,我如何按数据范围对订单进行分组?(我需要为每个数据范围获取该数据范围内的整个订单数组,不排除字段)

您可以使用$group运算符根据字段中的特定值对数据进行分组。然后,您可以使用push操作符生成这些值的数组

db.sales.aggregate([
    $match: {
        date: { "$gte": new Date(req.query.minDate), "$lte": new Date(req.query.maxDate) }
    },
    $group : {
        _id: "$date",
        orders: {
            $push: {
                deleted: "$deleted",
                total: "$total"       
             }
        }
    },
    $project: {
      _id: 1,
    orders: 1
   }
)];
您可以尝试以下方法:

 db.sales.aggregate([
    { $match: { date: { "$gte": new Date(req.query.minDate), "$lte": new Date(req.query.maxDate) } } },
    {
        $group: {
            _id: {
                $month: {
                    $dateFromString: {
                        dateString: '$date',
                        format: "%d/%m/%Y"
                    }
                }
            }, mergedOrders: { $push: '$$ROOT' }
        }
    }, {
        $addFields: {
            _id: {
                $let: {
                    vars: {
                        monthsInString: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']
                    },
                    in: {
                        $arrayElemAt: ['$$monthsInString', '$_id']
                    }
                }
            }
        }
    }])

测试:

您按“dd-mm-yyyy”分组。答案是按月分组。因此,
date
字段应转换为“yyyy-mm”格式进行分组,以便查询可以输出“Jan-2019”和“Jan-2020”。在“req.query.minDate”中日期的格式是什么?