javascript - MongoDB - 在一系列小时而不是日期之间查询

标签 javascript mongodb mongodb-query

我正在编写一个系统来处理消息传递。

用户的选项之一是 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/

相关文章:

javascript - 带有 WebSocket 的 typescript

node.js - Mongodb 日志泛滥

node.js - 使用 Monk 列出 MongoDB 中的集合名称

json - 选择具有特定键值对但不具有其他键值对的文档

javascript - 如何将名称中带有连字符的属性添加到脚本元素?

javascript - 主干监听模型中的对象变化

javascript - 重复 SVG 路径

angularjs - 如何使用node.js将数组插入mongodb

mongodb - 仅当文档早于 MongoDB 中的新文档时,如何更新插入?

mongodb - 在 mongodb 中查找一个或另一个词