用计数器提交小时范围的mongoose查询

时间:2017-12-19 12:44:04

标签: mongodb mongoose hour

这是架构:

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。

使用$的查询对我不起作用,结果始终为空。

1 个答案:

答案 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)