Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB-在小时范围而不是日期范围内进行查询_Javascript_Mongodb_Mongodb Query - Fatal编程技术网

Javascript MongoDB-在小时范围而不是日期范围内进行查询

Javascript MongoDB-在小时范围而不是日期范围内进行查询,javascript,mongodb,mongodb-query,Javascript,Mongodb,Mongodb Query,我正在编写一个处理消息的系统 用户的选项之一是DND(请勿打扰),其中用户可以定义一个不应向其发出警报的时间范围(例如22:00-08:00) 当我对用户执行查询时,我希望筛选出当前在DND上的用户 在每个用户的文档中,我定义了一个以秒为单位保存时间的字段: {dnd: {start: 22*3600, end: 8*3600}} 我不确定如何执行查询本身(以下示例由于重叠而无法工作) 另一种方法可能是将时间的“黑名单”存储为数组,并查询当前时间不是这些元素之一。这取决于你需要的颗粒度。小时或

我正在编写一个处理消息的系统

用户的选项之一是DND(请勿打扰),其中用户可以定义一个不应向其发出警报的时间范围(例如22:00-08:00)

当我对用户执行查询时,我希望筛选出当前在DND上的用户

在每个用户的文档中,我定义了一个以秒为单位保存时间的字段:

{dnd: {start: 22*3600, end: 8*3600}}
我不确定如何执行查询本身(以下示例由于重叠而无法工作)


另一种方法可能是将时间的“黑名单”存储为数组,并查询当前时间不是这些元素之一。这取决于你需要的颗粒度。小时或半小时可能是合理的,因为每分钟远不是太坏

因此,为了每分钟生成“黑名单”,您可以使用JavaScript代码,但原则很容易转换:

var start=22*60;
var端=8*60;
变量dnd=[start];
做{
启动++;
如果(开始==1440)
开始=0;
dnd.推送(启动);
}while(开始!=结束);
update({},{“$set”:{“dnd”:dnd},true)
本质上是针对用户记录设置“黑名单”

然后,当你询问时,比如说凌晨1:30,或者第90分钟,你会做:

db.user.find({“dnd”:{“$ne”:90})
由于“黑名单”包含该值,因此您不会返回该值在列表中的用户记录。但在超出“dnd”范围的一段时间内,它将返回:

db.user.find({“dnd”:{“$ne”:481})

显然,在调用用户记录的详细信息时,您通常希望排除数组元素,但这是一个简单的投影问题。

如果我们将反向比较-它在本例中有效,但在start=00:00和start=01:00(例如)时将失败。@Gilad很公平。我有一种替代方法,可以这是一个很酷的想法,它会起作用,但是我如何将这个列表转换回实际的小时数(为用户预设他的设置?)。我想我也可以保存原始值以避免每次重新计算。我接受这一点,因为它确实回答了我的问题,但我仍然希望知道如何将其转换回,以防万一:)
var current; // holds current time in seconds
db.user.find({$or:[{"dnd.start":{$gt:current}},{"dnd.end":{$lt:current}}]});