我将时间序列数据存储在多个固定大小的预分配文档中。当一个填满时,另一个被创建。每个文档都有两个预先计算的值:
我希望在按时间范围搜索时依赖这些预先聚合的值来查找一系列文档。以下示例为了清晰起见使用整数代替时间戳或日期。
问题:如何只知道感兴趣的时间范围(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)
]
}
答案 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}})