我想按日期对这类数据进行分组。我已经填充了数组,但我不知道在哪里聚合猫鼬数据
下面是我的例子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