MongoDB查找在过去7天内创建的文档,并在没有创建文档的日子返回0



我正在Mongo数据库中查找过去7天的文档。

我可以接收所需格式的数据,返回特定日期和在给定日期创建的numOfTickets:

{
"datesUsed": {
"startDate": "2022-04-02T14:42:14.223Z",
"endDate": "2022-04-09T14:42:14.223Z"
},
"data": [
{
"date": "02/04/2022",
"numOfTickets": 1
},
{
"date": "03/04/2022",
"numOfTickets": 1
},
{
"date": "04/04/2022",
"numOfTickets": 2
},
{
"date": "06/04/2022",
"numOfTickets": 1
},
{
"date": "07/04/2022",
"numOfTickets": 1
},
{
"date": "08/04/2022",
"numOfTickets": 2
},
{
"date": "09/04/2022",
"numOfTickets": 1
}
]
}

问题是,Mongo只在创建文档的日子返回数据,但在没有创建文档的时候不返回任何数据——在本例中是2022年4月5日。

我试图实现的是还包括另一个JSON对象,它可以用以下术语表示:

{
"date": "05/04/2022",
"numOfTickets": 0
}

这就是我目前所拥有的:

const companyId = req.query.companyId;
let dates = [];
const data = [];
// Last 7 days
const endDate = new Date();
const startDate = new Date(Date.now() - 604800000);
// Find tickets from past 7 days
const allCompanyTickets = await ticketModel
.find({
company_id: companyId,
createdAt: { $gte: new Date(startDate), $lte: new Date(endDate) },
})
.sort({ createdAt: 1 });
console.log(allCompanyTickets)
// Push them to an array
allCompanyTickets.forEach((ticket) => {
dates.push(ticket.createdAt.toLocaleDateString());
});
// Count occurences of days in the dates array
function countOccurrences(arr) {
return arr.reduce(function (a, b) {
a[b] = a[b] + 1 || 1;
return a;
}, []);
}
// Make an object from the data above
const datesOrdered = countOccurrences(dates);
// Give the data above keys and push it to a new array
for (let key in datesOrdered) {
const tempObj = { date: key, numOfTickets: datesOrdered[key] };
data.push(tempObj);
}
res.status(200).json({ datesUsed: { startDate, endDate }, data: data });

类似的东西

db.ticketModel.aggregate([
{
$set: {
datesUnused: {
$range: [ 0, { $dateDiff: { startDate: "$startDate", endDate: "$endDate", unit: "day" } } ]
}
}
},
{
$set: {
datesUnused: {
$map: {
input: "$datesUnused",
in: { 
date: { 
$dateAdd: { 
startDate: { $dateTrunc: { date: "$datesUsed.startDate", unit: "day" }, 
unit: "day", 
amount: "$$this" 
} 
},
numOfTickets: 0
}
}
}
}
},
{
$set: {
data: {
$filter: {
input: "$datesUnused",
cond: { $not: { $in: [ "$$this.date", "$data.date" ] } }
}
}
}
}
])

Mongo游乐场

最新更新