在猫鼬中如何按日期分组?



我想按日期对这类数据进行分组。我已经填充了数组,但我不知道在哪里聚合猫鼬数据

下面是我的例子mongo data

[{
"_id": "602badd505335124d77c07eb",
"createTime": "2021-02-06T14:38:49.000Z",
"services": [{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 230
},
{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 234
}
],
"items": [
null,
null
],
"total_amount": 16000
},
{
"_id": "602badfe05335124d77c07f0",
"createTime": "2021-02-07T14:38:49.000Z",
"services": [{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 230
},
{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 234
}
],
"items": [
null,
null
],
"total_amount": 16000
},
{
"_id": "602badfe05335124d77c07f3",
"createTime": "2021-02-07T14:38:49.000Z",
"services": [{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 230
},
{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 234
}
],
"items": [
null,
null
],
"total_amount": 16000
},
{
"_id": "602bae8705335124d77c07f5",
"createTime": "2021-02-08T14:38:49.000Z",
"services": [{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 230
},
{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 234
}
],
"items": [],
"total_amount": 16000
}
]

这是我用来产生结果的当前代码。正如你所看到的,我正在填充两个对象。我要做的是返回一个数组group by date (createdTime)

router
.route("/")
.get((req, res) => {
const match = {
shop_id: req.params.shop_id,
};
let beforeString, afterString, params, date, filter_by;
params = req.query
filter_by = params.filter_by
date = new Date(params.date)
if (filter_by =="date"){
beforeString = date
afterString = new Date(date.getTime() + 86400000) 
}

match.createdAt = {
$gte: moment(beforeString, "YYYY/MM/DD"),
$lt: moment(afterString, "YYYY/MM/DD"),
};
Income.find(match)
.populate("services.service_id")
.populate("items.item_id")
.then((result) => {
res.status(200).json(result);
}).catch((err) => res.status(400).json("error" + err));
});

我想要的结果是这样的,

{
"2021-02-06": [{
"_id": "602badd505335124d77c07eb",
"createTime": "2021-02-06T14:38:49.000Z",
"services": [{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 230
},
{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 234
}
],
"items": [
null,
null
],
"total_amount": 16000
}],
"2021-02-07": [{
"_id": "602badfe05335124d77c07f0",
"createTime": "2021-02-07T14:38:49.000Z",
"services": [{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 230
},
{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 234
}
],
"items": [
null,
null
],
"total_amount": 16000
},
{
"_id": "602badfe05335124d77c07f3",
"createTime": "2021-02-07T14:38:49.000Z",
"services": [{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 230
},
{
"service_id": "602bad6105335124d77c07ea",
"service_type": "Normal",
"service_name": "Water",
"price": 234
}
],
"items": [
null,
null
],
"total_amount": 16000
}
]
}
  • 本地排序:-
const arr = await Income.find(match).populate("services.service_id").populate("items.item_id");
const sortedArray = arr.sort((a, b) => a.createTime - b.createTime); // inc order
const sortedArray2 = arr.sort((a, b) => b.createTime - a.createTime); // dec order

您可以通过聚合管道首先实现这一点$match所有相关文档通过您的日期过滤器,然后$group您的文档通过您的createTime-字段的日期,最后$sort通过每个组的_id

Income.aggregate([
{ $match: match },
{
$group: {
_id: {
$dateToString: {
format: "%Y-%m-%d",
date: {
"$dateFromString": {
"dateString": "$createTime"
}
}
},

},
results: {
$push: "$$ROOT"
},

}
},
{
$sort: {
_id: 1
}
}
])

下面是一个简化的工作示例:https://mongoplayground.net/p/AKFWBlMu5P5

最新更新