【问题标题】:Query a document and all of its subdocuments that match a condition in mongodb在 mongodb 中查询一个文档及其所有匹配条件的子文档
【发布时间】:2017-01-04 13:55:25
【问题描述】:

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

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

我的结构是否有效?您是否有更好的结构来有效查询此类数据?

提前致谢!

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你可以试试下面的方法。

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

    【讨论】:

    • 完美运行!谢谢你。有没有办法在 java spring 中做到这一点?
    猜你喜欢
    • 2015-12-15
    • 2018-08-20
    • 2019-12-30
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多