我开始使用mongodb,我正在尝试查询具有此文档格式的数据库:
{ "_id" : ObjectId("520b8b3f8bd94741bf006033"), "value" : 0.664, "timestamp" : ISODate("2013-08-14T13:48:35Z"), "cr" : ISODate("2013-08-14T13:50:55.834Z") }
Run Code Online (Sandbox Code Playgroud)
我可以使用此查询从日期时间获取最后的记录:
> db.mycol.find({timestamp:{$gt: ISODate("2013-08-14T13:48:00Z")}}).sort({x:1});
Run Code Online (Sandbox Code Playgroud)
但是我试图从18分钟前获得一个带有值字段和时间戳的集合,我该如何为此构建查询?谢谢大家耐心等待...
H.D*_*.D. 51
对于18分钟的部分,这不是关于MongoDB,而是关于JavaScript和mongo shell中可用的内容:
query = {
timestamp: { // 18 minutes ago (from now)
$gt: new Date(ISODate().getTime() - 1000 * 60 * 18)
}
}
Run Code Online (Sandbox Code Playgroud)
在mongo shell中工作,但使用Mongo驱动程序用于其他语言会有所不同.
使用值和时间戳来"投影"在较小的模式上:
projection = {
_id: 0,
value: 1,
timestamp: 1,
}
Run Code Online (Sandbox Code Playgroud)
同时应用:
db.mycol.find(query, projection).sort({timestamp: 1});
Run Code Online (Sandbox Code Playgroud)
那么,这仍然不是一个"集",因为可能有重复.要摆脱它们,您可以使用$group聚合框架:
db.mycol.aggregate([
{$match: query},
{$group: {
_id: {
value: "$value",
timestamp: "$timestamp",
}
}},
{$project: {
value: "$_id.value",
timestamp: "$_id.timestamp",
}},
{$sort: {timestamp: 1}},
])
Run Code Online (Sandbox Code Playgroud)
小智 6
你也可以在下面做
db.getCollection('collectionName').find({timestamp : {$gte: new Date().getTime()-(60*60*1000) } } )
Run Code Online (Sandbox Code Playgroud)
上面的查询将为您提供时间戳 b/w 现在和 60 分钟的记录。如果您喜欢超过 60 分钟 - 比如说 2 小时,您可以将表达式更改为 (2*60*60*1000) 30 分钟 (30*60*1000)
从 开始Mongo 5,您可以使用$dateSubtract:
// { date: ISODate("2021-12-05T20:32:56Z") } <= 5 minutes ago
// { date: ISODate("2021-12-05T20:07:56Z") } <= 25 minutes ago (older than 18 minutes)
db.collection.aggregate([
{ $match: {
$expr: {
$gt: [
"$date",
{ $dateSubtract: { startDate: "$$NOW", unit: "minute", amount: 18 } }
]
}
}}
])
// { date: ISODate("2021-12-05T20:32:56Z") } <= 5 minutes ago
Run Code Online (Sandbox Code Playgroud)
使用,我们可以通过从当前日期( ) 中减去( ) ( )$dateSubtract来创建最旧的日期/时间,然后保留文档。18amount"minute"unit$$NOWstartDate
| 归档时间: |
|
| 查看次数: |
27031 次 |
| 最近记录: |