查询与mongodb中的条件匹配的文档及其所有子文档

时间:2017-01-04 13:55:26

标签: mongodb

我有一个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之间的时间戳”的子文档。

我知道聚合但是无法弄清楚,如何不仅返回匹配的子文档而且返回整个“心率” - 仅包含“数据”中匹配的子文档的文档。

我的结构有效吗?您是否有任何关于更好结构的提示,以便有效地查询此类数据?

提前致谢!

1 个答案:

答案 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]
                    }]
                }
            }
        }
    }
}])