2015-02-11 84 views
0

业务案例:我不想在一天中的一小时内(例如下班时间)检索不想被检索的用户。按时钟范围查询mongo文档 - 正向和反向

在接近这个

{ 
    'name': String, 
    'from': Number, // 800 (8:00 AM) 
    'to': Number, // 1700 (5:00 PM) 
    ... 
} 

的模式我使用的聚合来获取用户,同时还进行其它操作展开子文档阵列。基本搜索标准在$match运营商是这样的。

User.aggregate([ 
    { 
    // some aggregation stuff 
    }, 
    { 
    $match: { 
     $and: [ 
     { 'from': { $lte: currentTime }, 
     { 'to': { $gte: currentTime } 
     ] 
    } 
    } 
]); 

问题: 我怎样才能让用户设置反向范围?像8PM到8AM一样。我如何编写一个可以帮助解决这个问题的查询?今天没有留下任何头发。

回答

1

对于“正常”范围等上午9点到下午5时,查询条件是

{ "$match" : { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } } } 

$and是不必要的,因为它是隐含的),而“反向”范围等晚上8点至上午08点,查询条件是

{ "$match" : { "$or" : [{ "from" : { "$gte" : ct } }, { "to" : { "$lte" : ct } }] } } 

的逻辑是对于两种类型的范围不同,所以你应该添加新的字段为反向的范围:

{ 
    "name" : "Jerry", 
    "rfrom" : 2000, 
    "rto" : 800 
} 

,然后要么做聚合,用火柴

{ "$match" : { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } } } 

{ "$match" : { "$or" : [{ "rfrom" : { "$gte" : ct } }, { "rto" : { "$lte" : ct } }] } } 

或两个$match条件的脱节一个聚集:

{ "$match" : { "$or" : [ 
    { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } }, 
    { "$or" : [{ "rfrom" : { "$gte" : ct } }, { "rto" : { "$lte" : ct } }] } 
] } } 

另外,还有可能存在一个聪明的方式来存储你的时间范围这将在一个查询中适用于“正常”和“反向”范围,但是我在5分钟内想不起来。