如何在mongodb中过滤两次之间的数据



NodeJS

var filter = {};
filter.strBillDate = { 
    "$gte": new Date(req.params.fromdate), 
    "$lt": new Date(req.params.todate) 
};
Sales.find(filter).exec(function(err, salesdata) {
    return res.send(salesdata);
});

在这里,它将过滤这两天之间的数据。我需要每天过滤这些时间之间的数据。(即一周内7点至10点(

您可以尝试使用聚合框架,并在筛选文档时利用日期聚合运算符。

您需要一个初始的$match筛选器来筛选给定日期之间的文档。

然后,您可以使用$project管道创建一个新字段,该字段使用$hour运算符在日期字段中保存小时药剂。然后将应用另一个$match来筛选小时范围内的文档。

举个例子,它展示了这种方法,考虑到聚合框架,您需要投影您想要返回的字段:

var filter = {};
filter.strBillDate = { 
    "$gte": new Date(req.params.fromdate),  // start of week date
    "$lt": new Date(req.params.todate)      // end of week date
};
Sales.aggregate([
    { "$match": filter },
    {
        "$project": {
            "strBillDate": 1,
            "hourPart": { "$hour": "$strBillDate" },
            /*
                project other fields as necessary
            */
        }
    },
    { "$match": { "hourPart": { "$gte": 19, "$lte": 22 } } }
]).exec(function(err, salesdata) {
    return res.send(salesdata);
});

一种更有效的方法是使用$redact运算符的单个管道,如下所示:

Sales.aggregate([
    { 
        "$redact": { 
            "$cond": [
                { 
                    "$and": [  
                        { "$gte": [ "$strBillDate", new Date(req.params.fromdate) ] },
                        { "$lt": [ "$strBillDate", new Date(req.params.todate) ] },
                        { "$gte": [ { "$hour": "$strBillDate" }, 19 ] },
                        { "$lte": [ { "$hour": "$strBillDate" }, 22 ] }
                    ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
]).exec(function(err, salesdata) {
    if (!err) {
        return res.send(salesdata);
    }
});

最新更新