根据特定日期和时间从同一天的数据不同时间池中的mongo集合中过滤数据

时间:2018-01-30 03:53:41

标签: sql mongodb pymongo

我有一个用例,我必须在pymongo的mongo collection中根据特定日期和那天之前的任何项目过滤数据

前:

 A- 2018-01-29 10:01:00
 B- 2018-01-29 10:11:00
 C- 2018-01-29 10:23:00

 D- 2018-01-28 11:01:00
 E- 2018-01-28 11:04:00

我有过滤键2018-01-29 10:24:00,然后我必须只返回A,B和C.如果我有过滤键为2018-01-28 11:05:00,那么我有只返回D和E.如果我有标准2018-01-29 10:13:00,那么我必须返回A和B.如果我有过滤键为2018-01-28 11:02:00,那么我必须只返回D.扩展这个,另一个条件是如果我有2018-01-28 11:02:00的密钥,那么CASE A应该返回D而CASE B应该返回E.类似于Key 2018-01-29 10:13:00, CASE A应返回A和B,CASE B应仅返回C.

1 个答案:

答案 0 :(得分:0)

你需要找到所有小于输入时间的记录,也应该在同一小时内,你可以尝试

searchDate是日期条件

$date来自集合

db.col.find(
    {$expr : 
        {$and : 
            [
                {$lte: ["$date", searchDate]}, 
                {$eq : [ {$hour : "$date"}, {$hour : searchDate}]},
                {$eq : [ {$dayOfMonth : "$date"}, {$dayOfMonth : searchDate}]},
                {$eq : [ {$month : "$date"}, {$month : searchDate}]},
                {$eq : [ {$year : "$date"}, {$year : searchDate}]},
            ]
        }
    }
)

聚合管道

db.col.aggregate([
{$match:
    {$expr : 
        {$and : 
            [
                {$lte: ["$date", searchDate]}, 
                {$eq : [ {$hour : "$date"}, {$hour : searchDate}]},
                {$eq : [ {$dayOfMonth : "$date"}, {$dayOfMonth : searchDate}]},
                {$eq : [ {$month : "$date"}, {$month : searchDate}]},
                {$eq : [ {$year : "$date"}, {$year : searchDate}]},
            ]
        }
    }
}
])