我有一个MongoDB存储来自不同传感器的数据。 它具有以下结构:
{
"_id" : 1,
"sensorName" : "Heart Rate",
"samplePeriod" : 1000,
"data" : [
{
"timestamp" : NumberLong("1483537204046"),
"dataPoints" : [ 68 70 ]
},
{
"timestamp" : NumberLong("1483537206046"),
"dataPoints" : [ 68 70 ]
}
]
}
{
"_id" : 2,
"sensorName" : "Ambient Light",
"samplePeriod" : 500,
"data" : [
{
"timestamp" : NumberLong("1483537204058"),
"dataPoints" : [ 56, 54, 54, 54 ]
},
{
"timestamp" : NumberLong("1483537206058"),
"dataPoints" : [ 56, 54, 54, 54 ]
}
]
}
现在我需要“心率” - 包含其所有字段及其“数据”字段的文档 - 符合条件“1483537204000和1483537214000之间的时间戳”的子文档。
我知道聚合但是无法弄清楚,如何不仅返回匹配的子文档而且返回整个“心率” - 仅包含“数据”中匹配的子文档的文档。
我的结构有效吗?您是否有任何关于更好结构的提示,以便有效地查询此类数据?
提前致谢!
答案 0 :(得分:0)
您可以尝试以下内容。
$匹配以保持心率记录。
$ filter以使用条件过滤子文档。
$ project显示结果。
aggregate([{
$match: {
"_id": 1
}
}, {
"$project": {
"_id": 1,
"sensorName": 1,
"samplePeriod": 1,
"data": {
"$filter": {
"input": "$data",
"as": "result",
"cond": {
$and: [{
$gte: ["$$result.timestamp", 1483537204000]
}, {
$lte: ["$$result.timestamp", 1483537214000]
}]
}
}
}
}
}])