我对MongoDB很陌生。我有一个具有以下文档结构的集合:
{
"active": true,
"days": [],
"start_date": ISODate("..."),
"end_date": ISODate("..."),
"frequency": 600000,
"latest_execution_date": ISODate("...")
}
{
"active": false,
"days": [1, 2, 3],
"start_date": ISODate("..."),
"end_date": ISODate("..."),
"frequency": 600000,
"latest_execution_date": ISODate("...")
}
{
"active": true,
"days": [2, 5],
"start_date": ISODate("..."),
"end_date": ISODate("..."),
"frequency": 600000,
"latest_execution_date": ISODate("...")
}
我要查找的是,“天”为空或星期几为当前日期的活动文档在数组中,当前日期在“开始日期”和“结束日期”之间,而“最新执行日期”和“当前日期大于“频率”。
我已经创建了此查询,并且对我有用,但是我正在使用的MongoDB服务器不再支持“ $ where”。
db.myCollection.find({
$where: function() {
const currentDate = new Date();
const latestExecution = new Date(this.latest_execution_date);
return (
this.active &&
this.start_date <= currentDate &&
this.end_date >= currentDate &&
(this.days.includes(currentDate.getDay()) || this.days.length === 0) &&
(this.latest_execution_date === null || ((currentDate.valueOf() - latestExecution.valueOf()) >= this.frequency))
);
}
})
我试图用“聚合”代替“查找”,但是我一直坚持减法和比较,这就是我现在所拥有的,但是$ cmp无法正常工作。
db.myCollection.aggregate([{
$project: {
active: "$active",
start_date: "$start_date",
end_date: "$end_date",
days: "$days",
frequency: "$frequency"
latest_execution_date: "$latest_execution_date",
dateDifference: {
$subtract: [ new Date(), "$latest_execution_date" ]
},
compare: {
$cmp: [ "$dateDifference", "$frequency" ]
}
}
},
{
$match: {
active:{$eq:true},
start_date:{$lte: ISODate("...")},
end_date:{$gte: ISODate("...")},
$and: [
{ $or:[ { days:{$size:0}}, { days:{$elemMatch:{$eq:<day of the week>} } }] },
{ $or: [ { latest_execution_date: { $eq: null } }, { compare: { $lte: 0 } } ] }
]
}
}
])
这种方法的主要问题是始终返回“ -1”的“ $ cmp”,无论“频率”是否更大都没有关系。我检查了数据类型,频率为Int32,dateDifference为Int64。将频率转换为Int64(频率:{$ convert:{输入:“ $ frequency”,到:“ long”}})我得到了相同的结果。
有人知道如何解决此问题?或有不同的方法来解决此问题? 欢迎所有的建议,建议或批评家。
谢谢!
答案 0 :(得分:0)
我没有时间发布我的解决方案。 如果有帮助,我就放在这里。
db.myCollection.aggregate([{
$project: {
...
dateDifference: {
$subtract: [{ $subtract: [new Date(), '$latest_execution_date'] }, '$frequency']
}
}
},
{
$match: {
...
$and: [
{ $or:[ { days:{$size:0}}, { days:{$elemMatch:{$eq:<day of the week>} } }] },
{ $or: [ { latest_execution_date: { $eq: null } }, { dateDifference:{$gte:0}} ] }
]
}
}
])
基本上,我意识到我无缘无故地使解决方案复杂化了,只需添加一个嵌套的减法即可,然后检查结果。