2 回答

TA贡献1998条经验 获得超6个赞
你可以试试这个:
db.Orders.aggregate([
{
"$addFields": {
"closed_at_iso": {
"$toDate": "$closed_at"
}
}
},
{
$match: {
"closed_at_iso": {
$gte: new Date(new Date() - 7 * 24 * 60 * 60 * 1000)
}
}
}
])
这里的问题是日期字段实际上是一个字符串,我们需要先将其转换为格式,然后运算符工作正常。ISODate$match
编辑:
要获取上周周一和本周一之间的数据,您可以尝试:
var start = new Date(2020, 5, 1), // last monday
end = new Date(2020, 5, 8); // this monday
db.collection.aggregate([
{
"$addFields": {
"closed_at_iso": {
"$toDate": "$closed_at"
}
}
},
{
$match: {
"closed_at_iso": {
$gte: start,
$lte: end
}
}
}
])
如果你想让它变得动态,我们可以很容易地得到上周一和这个星期一,比如:
function getMonday(d) {
d = new Date(d);
var day = d.getDay(), diff = d.getDate() - day + (day == 0 ? -6:1);
return new Date(d.setDate(diff));
}
var start = getMonday(new Date().setDate(new Date().getDate() - 7))
var end = getMonday(new Date())
console.log(start)
console.log(end)

TA贡献1802条经验 获得超4个赞
使用palash的答案想出一个解决方案
let beforeOneWeek = new Date(new Date().getTime() - 60 * 60 * 24 * 7 * 1000)
, day = beforeOneWeek.getDay()
, diffToMonday = beforeOneWeek.getDate() - day + (day === 0 ? -6 : 1)
, lastMonday = new Date(beforeOneWeek.setDate(diffToMonday))
, lastSunday = new Date(beforeOneWeek.setDate(diffToMonday + 6));
const orders = await Orders.aggregate([
{
'$addFields': {
'created_at_iso': {
'$toDate': '$created_at'
}
}
},
{
$match: {
'created_at_iso': {
$gte: lastMonday,
$lte: lastSunday
}
}
}
]);
添加回答
举报