我正在编写一个系统来处理消息传递。
用户的选项之一是 DND(请勿打扰),用户可以定义不应提醒他的时间范围(例如 22:00 - 08:00)。
当我对用户执行查询时,我希望过滤掉当前处于 DND 状态的用户。
在每个用户的文档中,我定义一个字段来保存时间(以秒为单位):
{dnd: {start: 22*3600, end: 8*3600}}
我不确定如何执行查询本身(由于午夜重叠,以下示例将不起作用)
var current; // holds current time in seconds
db.user.find({$or:[{"dnd.start":{$gt:current}},{"dnd.end":{$lt:current}}]});
最佳答案
另一种方法可能是将时间“黑名单”存储为数组,并查询当前时间不是这些元素之一。这取决于您需要的粒度。几个小时或半小时可能是合理的,只要每分钟还不错。
因此,要每分钟生成“黑名单”,您可以使用 JavaScript 代码,但原理很容易转换:
var start = 22 * 60;
var end = 8 * 60;
var dnd = [start];
do {
start++;
if ( start == 1440 )
start = 0;
dnd.push( start );
} while ( start != end );
db.user.update({},{ "$set": { "dnd": dnd } },true)
本质上是针对用户记录设置“黑名单”。
然后,当您查询早上 1:30 或第 90 分钟时,您会执行以下操作:
db.user.find({ "dnd": { "$ne": 90 })
由于“黑名单”包含该值,因此您不会返回该值在列表中的用户记录。但对于超出“dnd”范围的时间,它将返回:
db.user.find({ "dnd": { "$ne": 481 })
显然,在调用用户记录的详细信息时,您通常希望排除数组元素,但这是一个简单的投影问题。
关于javascript - MongoDB - 在一系列小时而不是日期之间查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24794354/