这是架构:
var LogSchema = new mongoose.Schema({
EventId: { type: String, required: [true, "EventId can't be empty"]},
Computer: { type: String, required: [true, "Computer can't be empty"] },
TimeCreated: { type: Date, default: Date.now },
IpAddress: { type: String },
FailureReason: { type: String },
TargetUserName: { type: String },
SubjectUserName:{ type: String },
moreInfo: [{ type: String}],
})
我需要一个弹出所有行的查询: 'TimeCreated'>晚上10点和'TimeCreated'<上午06时
此外,查询通过$或者检查'EventId',这是查询:
rulesMap :{
eventId : [6416,4159],
period: [config.hours._10_PM, config.hours._6_AM],
maximum: 10,
onlyFailed: false,
}
var query = {
$or: [],
$and:[]
};
rulesMap.eventId.forEach(function (eventId) {
query.$or.push({'EventId':eventId});
});
query.$and.push({'TimeCreated':{$gt: rulesMap.period[0], $lt: rulesMap.period[1]}});
logSchema.find(query).exec(function (err, logs) {
callback(err, logs)
})
我需要提醒结果的数量是否多于rulesMap.maximum。
使用$的查询对我不起作用,结果始终为空。
答案 0 :(得分:0)
继续comments,您需要使用聚合框架进行上述查询。您的渠道将包含 $match
和 $redact
阶段。
初始 $match
步骤将保存带有eventId
数组值的第一个查询。然后,第二个管道步骤将使用 $redact
运算符在TimeCreated字段上使用$ hour运算符查询文档,而无需额外的 $project
强>管道。
以下聚合操作显示了上述概念:
const rulesMap = {
eventId : [6416,4159],
period: [config.hours._10_PM, config.hours._6_AM],
maximum: 10,
onlyFailed: false,
};
const match = {
"$match": {
"EventId": {
"$in": rulesMap.eventId
}
}
};
const redact = {
"$redact": {
"$cond": [
{
"$and": [
{ "$lt": [ { "$hour": "$TimeCreated" }, 6 ] },
{ "$gt": [ { "$hour": "$TimeCreated" }, 22 ] }
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
logSchema.aggregate([match, redact]).exec(callback)