Javascript MongoDB:如何在带有时间戳输入的查询中按15分钟周期进行过滤?
我有一个“简单”的问题,我在脑海中想到了一个“复杂”的解决方案,但我在执行它时遇到了问题 问题是,我有一个模式:Javascript MongoDB:如何在带有时间戳输入的查询中按15分钟周期进行过滤?,javascript,node.js,mongodb,datetime,filter,Javascript,Node.js,Mongodb,Datetime,Filter,我有一个“简单”的问题,我在脑海中想到了一个“复杂”的解决方案,但我在执行它时遇到了问题 问题是,我有一个模式: const DensitySchema = mongoose.Schema( { map_id: mongoose.Schema.Types.ObjectId, name: String, location: { x: Number, y: Number }, density: Number, time: N
const DensitySchema = mongoose.Schema(
{
map_id: mongoose.Schema.Types.ObjectId,
name: String,
location: {
x: Number,
y: Number
},
density: Number,
time: Number
},
{
timestamps: true
}
);
我还有一个疑问:
Density.find({ map_id: req.params.mapId, time: { $gte: req.query.from, $lte: req.query.to } }).then(data => {
console.log(data);
res.send(data);
});
时间和从-到值是时间戳,例如,1579148100
在数据库中,我有每15秒出现一次的时间戳条目。但是我只想得到那些发生在时间戳中的结果,这些时间戳的分钟数是15
和0
的倍数,所以0,15,30,45
如果我问凌晨1点到凌晨2点之间的值,我会得到4个结果,而不是几十个
根据我在mongo文档中看到的内容,我应该能够以某种方式过滤查询请求,通过某种方式将时间值转换为可读的日期,然后检查分钟数是否是这些值之一。。。但我想我不够聪明,不知道如何。。。文档对我来说还不是那么容易理解,因为我本周开始使用mongo
我将非常感谢你的帮助
提前感谢并致以亲切问候。时间戳是一个
长的
,相应的时间(小时、分钟、月等格式)可以用日期
字段构造。例如,我有三个时间戳和相应的时间(小时和分钟):
从Mongo Shell中,新日期(1579243569270)
获取日期/时间为ISODate(“2020-01-17T06:46:09.270Z”)
。从中我们可以找到时间分钟,在本例中为06:46
。并且,我们在查询中使用查找
或聚合
,如下所示:
输入集合:
查询: _或_ 结果将是带有时间戳的两个文档,
1579243509270
和157924415497
该代码针对Mongo Shell进行了测试。查询使用与一起使用的来构造查询
[编辑和添加]
db.test.find( { $expr: { $in: [ { $minute: { $toDate: "$ts" } }, MINS_ARRAY ] },
map_id: req.params.mapId,
time: { $gte: req.query.from, $lte: req.query.to }
} )
时间戳为
长
,相应的时间(小时、分钟、月等格式)可以用日期
字段构造。例如,我有三个时间戳和相应的时间(小时和分钟):
从Mongo Shell中,新日期(1579243569270)
获取日期/时间为ISODate(“2020-01-17T06:46:09.270Z”)
。从中我们可以找到时间分钟,在本例中为06:46
。并且,我们在查询中使用查找
或聚合
,如下所示:
输入集合:
查询: _或_ 结果将是带有时间戳的两个文档,
1579243509270
和157924415497
该代码针对Mongo Shell进行了测试。查询使用与一起使用的来构造查询
[编辑和添加]
db.test.find( { $expr: { $in: [ { $minute: { $toDate: "$ts" } }, MINS_ARRAY ] },
map_id: req.params.mapId,
time: { $gte: req.query.from, $lte: req.query.to }
} )
我回复了你的答案,所以我可以使用代码格式,我也是stackoverflow新手,呵呵,谢谢你的帮助!!我回复了你的答案,所以我可以使用代码格式,我也是stackoverflow新手,呵呵,谢谢你的帮助!!
const MINS_ARRAY = [ 0, 15, 30, 45 ]
db.test.find( { $expr: { $in: [ { $minute: { $toDate: "$ts" } }, MINS_ARRAY ] } } )
db.test.aggregate( [
{
$match: {
$expr: {
$in: [ { $minute: { $toDate: "$ts" } }, MINS_ARRAY ] }
}
}
}
] )
db.test.find( { $expr: { $in: [ { $minute: { $toDate: "$ts" } }, MINS_ARRAY ] },
map_id: req.params.mapId,
time: { $gte: req.query.from, $lte: req.query.to }
} )