如何在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”中日期的格式是什么?