Mongodb-查询两个时间戳之间的文档

时间:2019-08-07 17:01:03

标签: mongodb

我的文档结构如下:

{
"escalation" : null,
"reclassified" : false,
"timestamp" : "1559164897437",
"endFlow" : "false",
"channel" : "web",
"intents" : null
},
{
"escalation" : null,
"reclassified" : false,
"timestamp" : "1565196671234",
"endFlow" : "true",
"channel" : "web",
"intents" : null
}  

我想查询两个时间戳之间的上述文档,例如“ 1559254897437”和“ 1563996671234”。
请注意,我将timestamp字段的值存储为字符串,而不是整数。

我尝试过的事情:

db.getCollection('messagelogs').find({
    'timestamp':{
        $lte:1559164897437,
        $gte:1560351891811}
        })

很遗憾,这将返回任何文档。

在两个时间戳之间提取文档的正确查询是什么?

2 个答案:

答案 0 :(得分:4)

由于时间戳在DB中以字符串形式出现,因此我们需要在字符串范围而不是数字中查询它。以下查询可以为您提供预期的输出:

db.getCollection('messagelogs').find(
{
    'timestamp':{
        $gte:'1559164897437',
        $lte:'1560351891811'
    }
})

输出:

{
    "_id" : ObjectId("5d4b1ccdcbfa696dcd9924a3"),
    "escalation" : null,
    "reclassified" : false,
    "timestamp" : "1559164897437",
    "endFlow" : "false",
    "channel" : "web",
    "intents" : null
}

答案 1 :(得分:1)

基本上,您要尝试的操作是在每个文档上执行AND操作,这表示您需要一个文档,该文档的时间戳记$ lte为时间戳记,同时$ gte为不同的时间戳记,相反,您需要执行OR以获得外边界即如果任一条件匹配,请带出文件,请执行以下操作:

db.getCollection('messagelogs').find({$or: [{'timestamp': {$lte:'1559164897437'}}, {'timestamp': {$gte:'1560351891811'}}] })

假设您犯了一个错误,如果您需要在特定时间之间使用文档,则需要交换时间戳记:

db.getCollection('messagelogs').find({$and: [{'timestamp': {$lte:'1560351891811'}}, {'timestamp': {$gte:'1559164897437'}}] })

或简单地:

db.getCollection('messagelogs').find({'timestamp': {$gte:'1559164897437', $lte: '1560351891811'}})