业务案例:我不想检索那些不想在一天中的某个时间段(例如下类时间)被检索到的用户。
在与此接近的架构上
{
'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 }
]
}
}
]);
问题: 如何允许用户也设置反向范围?比如晚上 8 点到早上 8 点。我怎样才能编写一个有助于解决这个问题的查询?今天没有头发可拔。
最佳答案
对于“正常”范围(例如上午 9 点到下午 5 点),查询条件为
{ "$match" : { "from" : { "$lte" : ct }, "to" : { "$gte" : ct } } }
($and
是不必要的,因为它是隐含的)而对于像晚上 8 点到上午 8 点这样的“反向”范围,查询条件是
{ "$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 分钟内想到它。
关于javascript - 按时钟范围查询 mongo 文档 - 正向和反向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28462931/