我创建了一个非常类似于时间序列数据文档here的数据库模式。
我最终得到了以下文件:
{
"_id" : "unique_name_1",
"data" : {
"2017" : {
"5" : {
"21" : {
"61" : [
{
"timestamp" : 1498162890460.0,
"value" : true
}
],
"84" : [
{
"timestamp" : 1498183202126.0,
"value" : false
}
]
},
"22" : {
"24" : [
{
"timestamp" : 1498215602957.0,
"value" : true
}
],
"61" : [
{
"timestamp" : 1498249322863.0,
"value" : false
}
]
}
},
"9" : {
"16" : {
"36" : [
{
"timestamp" : 1508249031987.0,
"value" : true
},
{
"timestamp" : 1508249429052.0,
"value" : false
}
]
}
}
}
}
}
'data' 下的第一个子文档代表年份。第二个子文档代表月份。第三个子文档代表日期。第四个子文档表示事件发生当天的15 分钟间隔。
我想每天查询数据库并获取第一个 true(如果可能的话,可能是紧随其后的 false),同时忽略所有后续条目。
每天的第一个条目可能是也可能不是。数据不一定总是从真到假再到真。例如,我可能连续有几个真值,在这种情况下,我想忽略所有后续的真值。
这种结构对于查询特定时间非常有用,如果您知道它们,但我无法查询特定值。我应该只查询整个文档并在前端解析它吗?如果我想对数百个文档运行相同的查询,这将变得更加困难。
谢谢您的帮助。
要在一天的上下文中分析您的数据,您必须使用一长串$objectToArray结合$unwind。那是因为找出代表日、月、年的唯一方法是分析嵌套级别。然而,一旦你这样做了,剩下的就很简单了。尝试:
db.col.aggregate([
{
$project: {
data: { $objectToArray: "$data" }
}
},
{
$unwind: "$data"
},
{
$project: {
year: "$data.k",
data: { $objectToArray: "$data.v" }
}
},
{
$unwind: "$data"
},
{
$project: {
year: 1,
month: "$data.k",
data: { $objectToArray: "$data.v" }
}
},
{
$unwind: "$data"
},
{
$project: {
year: 1,
month: 1,
day: "$data.k",
data: { $objectToArray: "$data.v" }
}
},
{
$unwind: "$data"
},
{
$project: {
year: 1,
month: 1,
day: 1,
interval: "$data.k",
data: "$data.v"
}
},
{
$unwind: "$data"
},
{
$match: { "data.value": true }
},
{
$sort: {
"data.timestamp": 1
}
},
{
$group: {
_id: {
year: "$year",
month: "$month",
day: "$day"
},
firstPositive: {
$first: "$data"
}
}
}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句