我的文档结构如下:
{
"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}
})
很遗憾,这将返回任何文档。
在两个时间戳之间提取文档的正确查询是什么?
答案 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'}})