我正在编写一个处理消息传递的系统。
用户的一个选项是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}}]});
答案 0 :(得分:1)
另一种方法可能是存储"黑名单"作为数组和查询的次数,当前时间不是这些元素之一。这取决于你需要多少粒度。小时或半小时可能是合理的,因为每分钟也不算太差。
所以要生成"黑名单"每分钟你可以做,作为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 })
显然,您通常希望在调用用户记录的详细信息时排除数组元素,但这只是一个简单的投影问题。