我从mongodb开始,我正在尝试查询具有此文档格式的数据库:
{ "_id" : ObjectId("520b8b3f8bd94741bf006033"), "value" : 0.664, "timestamp" : ISODate("2013-08-14T13:48:35Z"), "cr" : ISODate("2013-08-14T13:50:55.834Z") }
我可以使用此查询从日期时间获取最后一条记录:
> db.mycol.find({timestamp:{$gt: ISODate("2013-08-14T13:48:00Z")}}).sort({x:1});
但是我试图从18分钟前获得一个带有值字段和时间戳的集合,我该如何为此构建查询? 感谢大家的耐心......
答案 0 :(得分:47)
对于18分钟的部分,这不是关于MongoDB,而是关于JavaScript和mongo shell中可用的内容:
query = {
timestamp: { // 18 minutes ago (from now)
$gt: new Date(ISODate().getTime() - 1000 * 60 * 18)
}
}
在mongo shell中工作,但使用Mongo驱动程序用于其他语言会有所不同。
使用值和时间戳对较小的模式进行“投影”:
projection = {
_id: 0,
value: 1,
timestamp: 1,
}
同时应用:
db.mycol.find(query, projection).sort({timestamp: 1});
嗯,这仍然不是一个“集”,因为可能有重复。要摆脱它们,您可以使用聚合框架中的$group
:
db.mycol.aggregate([
{$match: query},
{$group: {
_id: {
value: "$value",
timestamp: "$timestamp",
}
}},
{$project: {
value: "$_id.value",
timestamp: "$_id.timestamp",
}},
{$sort: {timestamp: 1}},
])
答案 1 :(得分:4)
您也可以在下面进行
db.getCollection('collectionName').find({timestamp : {$gte: new Date().getTime()-(60*60*1000) } } )
上面的查询ll给您现在和60分钟的黑白时间戳记录。如果您喜欢60分钟以上-例如2小时,则可以将表达式更改为(2 * 60 * 60 * 1000) 30分钟(30 * 60 * 1000)
答案 2 :(得分:2)
db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}})
仅获取我需要的字段:
db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}},{value:1,timestamp:1, _id:0})
答案 3 :(得分:0)
您可以使用nodejs从mongodb访问当前时间戳的数据
const collection1 = dbo.collection('customers');
var dateq = new Date();
collection1.find({ "Timestamp" : { $gt: new Date(dateq.getTime() - 6000)}
}).toArray(function(err , docs){
console.log(docs);
}
代码结尾