在mongodb中查询符合条件的文档及其所有子文档

在mongodb中查询符合条件的文档及其所有子文档,mongodb,Mongodb,我有一个MongoDB存储来自不同传感器的数据。 其结构如下: { "_id" : 1, "sensorName" : "Heart Rate", "samplePeriod" : 1000, "data" : [ { "timestamp" : NumberLong("1483537204046"), "dataPoints" : [ 68 70 ]

我有一个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之间”匹配

我知道聚合,但不知道如何不仅返回匹配的子文档,而且返回整个“心率”——在“数据”中仅包含匹配子文档的文档

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


提前谢谢

您可以尝试下面的方法

$match保存心率记录

$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]
                    }]
                }
            }
        }
    }
}])

很好用!非常感谢。在JavaSpring中有什么方法可以做到这一点吗?