我想按日期对此类数据进行分组。 我已经填充了数组,但我不知道在哪里聚合猫鼬数据
这是我的示例 mongo 数据
[{
"_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
}
]
这是我用来产生结果的当前代码。如您所见,我正在填充两个对象。我想要做的是我想按日期返回一个数组组(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
}
]
}
答案 0 :(得分:0)
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
答案 1 :(得分:0)
您可以通过 aggregation pipeline 来实现这一目标
$match
按日期过滤器的所有相关文档,然后按 $group
字段的日期 createTime
您的文档,最后按组的每个 {{1} }.
$sort
以下是 mongoplayground 的简化工作示例:https://mongoplayground.net/p/AKFWBlMu5P5