我有一个包含作者的模型(即 mongoose.Schema.ObjectId),并且我在该模型上有一个日期字段(类型为日期)。
当我这样做时它有效,数据返回:
MyModel.find({
author: req.user._id,
started: {
$gte: start,
$lte: end
}
});
但是我的 Schema 中有一个聚合函数,它是这样的:
myModelSchema.statics.getSomeData = function getSomeData(id, start, end) {
const query = [
{ $sort: { started: 1 } },
{
$lookup: {
from: 'projects',
localField: 'project',
foreignField: '_id',
as: 'projectdata'
}
},
{
$lookup: {
from: 'tasks',
localField: 'task',
foreignField: '_id',
as: 'taskdata'
}
}
];
if (start && end) {
query.unshift({
$match: {
$and: [{ started: { $gte: start, $lte: end } }, { author: id }]
}
});
} else {
query.unshift({ $match: { author: id } });
}
return this.aggregate(query);
};
注意:我为作者推送匹配器的部分,让我获得了当前作者作品的所有数据,但我也想要的部分在日期范围内返回的数据不起作用,数据为空,当开始和结束日期传递给静态函数时。
我传递给聚合函数的日期格式:'2018-11-04 06:00:00'(一个字符串)。
最佳答案
实际上你匹配的是一个日期对象和字符串值,这根本不起作用,所以值也应该是一个日期对象
myModelSchema.statics.getSomeData = function getSomeData(id, start, end) {
const query = [
{ $sort: { started: 1 } },
{
$lookup: {
from: 'projects',
localField: 'project',
foreignField: '_id',
as: 'projectdata'
}
},
{
$lookup: {
from: 'tasks',
localField: 'task',
foreignField: '_id',
as: 'taskdata'
}
}
];
if (start && end) {
query.unshift({
$match: {
$and: [{ started: { $gte: new Date(start), $lte: new Date(end) } }, { author: id }]
}
});
} else {
query.unshift({ $match: { author: id } });
}
return this.aggregate(query);
};
关于javascript - 如何让匹配器使用日期范围的聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53140439/