【发布时间】:2020-07-17 22:40:55
【问题描述】:
我需要在数据库(猫鼬)中查询并返回一年中每个月为一种特定产品(一年内)所做的销售数量。
我是 node 和 mongoDb 的新手,我提供了一个“虚拟”解决方案,我在数据库中查询并取回一个产品的所有结果,然后我使用 3 个循环在几个月内拆分结果,但我认为它使用的资源比它应该使用的更多,如果它充满更多的数据,它会使用更多的资源,所以我需要帮助进行数据库查询来解决这个问题。
这是我的代码中执行此操作的部分:
假设需要从 17-02-2020 到 17-02-2019 的结果, 我知道,如果是从 1 月 到 12 月,它将毫无意义地进入一个循环 但我有另一部分代码控制它是否需要 1 年 结果例如:01-01-2020 到 31-12-2020 它不会执行代码 下面,我所说的代码只有一个循环,哈哈。
let startTime = performance.now();
Sales.find({productId:req.params.productId, "created_at": { "$gte": oneYearFromNow, "$lte": dateNow}}).then(result => {
let newMonthsArray= new Array();
let monthsArray = ['January','February','March','April','May','June','July','August','September','October', 'November','December'];
let months = {};
for(let i=parseInt(req.params.startDate.substring(5,7))-1; i<12; i++){
let year = parseInt(req.params.startDate.substring(0,4))-1;
let month = parseInt(req.params.startDate.substring(5,7));
newMonth = monthsArray[i] + '-' + year;
newMonthsArray.push(newMonth);
months[newMonth] = 0;
}
for(let i=0; i<parseInt(req.params.startDate.substring(5,7)); i++){
let year = parseInt(req.params.startDate.substring(0,4));
let month = parseInt(req.params.startDate.substring(5,7));
newMonth = monthsArray[i] + '-' + year;
newMonthsArray.push(newMonth);
months[newMonth] = 0;
}
for(i=0; i<result.length; i++){
let getDate = result[i].created_at.toISOString();
let year = getDate.substring(0,4);
let month = parseInt(getDate.substring(5,7));
let monthName = monthsArray[month-1];
let date = monthName + '-' + year;
let count = Number(months[date]) + 1;
months[date] = count;
}
let endTime = performance.now();
res.status(200).send({Data: months, 'Execution time': endTime - startTime + ' mls'});
});
我希望一切都清楚,我想我 需要使用聚合,但我不确定如何使用!
样本数据:
{
{
"created_at": "2020-04-04T17:02:07.832Z",
"updated_at": "2020-04-04T17:02:07.832Z",
"_id": "5e88bdcda3080736ac70f9c1",
"price": 16800,
"productId": "5e88bf90b9e5102ae46b154e",
"__v": 0
},
{
"created_at": "2020-04-04T17:02:07.832Z",
"updated_at": "2020-04-04T17:02:07.832Z",
"_id": "5e88bdf9a3080736ac70f9c2",
"price": 12800,
"productId": "5e88bf90b9e5102ae46b154e",
"__v": 0
}
}
想要的结果:
【问题讨论】:
-
如果您发布示例数据+预期结果会更好地理解,因为我们似乎可以通过聚合在 MongoDB 端执行此逻辑
-
@Valijon 抱歉,我忘记了。我刚刚做了这些更改。谢谢
标签: node.js mongodb mongoose mongodb-query aggregation-framework