检索存储时间序列数据的文档,只知道上一个结束和下一个开始?

时间:2017-07-23 23:07:04

标签: mongodb

我将时间序列数据存储在多个固定大小的预分配文档中。当一个填满时,另一个被创建。每个文档都有两个预先计算的值:

  • prevEnd(将值存储在先前文档值的最后一个索引中)
  • nextStart(将值存储在下一个文档的第一个索引中)

我希望在按时间范围搜索时依赖这些预先聚合的值来查找一系列文档。以下示例为了清晰起见使用整数代替时间戳或日期。

问题:如何只知道感兴趣的时间范围(111-114),我如何选择以下两个文件?

{
"prevEnd"; 107,
"nextStart": 110,
"time" : [ 
    NumberLong(107)
    NumberLong(108)
    NumberLong(109)
]
},

//-----------------Select Start

{
    "prevEnd": 109,
    "nextStart": 113,
    "time" : [ 
        NumberLong(110), 
        NumberLong(111), 
        NumberLong(112),
    ]
},


{
    "prevEnd": 112,
    "nextStart": 116,
    "time" : [ 
        NumberLong(113), 
        NumberLong(114), 
        NumberLong(115)
    ]
},

//-----------------Select End

{
    "prevEnd": 115,
    "nextStart": 99999999999999999999999999999999,
    "time" : [ 
        NumberLong(116), 
        NumberLong(117), 
        NumberLong(118)
    ]
}

1 个答案:

答案 0 :(得分:1)

以下find()调用将起作用:

db.collection.find({"time": {"$elemMatch": {$gt: 111, $lt: 114}}})

因为它使用$elemMatch运算符来匹配包含时间字段的文档,其中至少有一个元素匹配 上限和下限。

但是因为你的问题明确提到了prevEnd和nextStart,我怀疑你正在寻找一个过滤那些属性的解决方案。例如:

db.collection.find({$or: [{"prevEnd": {$gt: 111}}, {"nextStart": {$gt: 111}}], "prevEnd": {$lt: 114}})