项目数据设置为新对象

时间:2016-05-24 14:42:13

标签: mongodb mongodb-query aggregation-framework

我有一个非常简单的问题让我困扰了一段时间。我有一个包含Measurements数组的对象列表,其中每个对象包含一个时间和多个值,如下所示:

{
    "_id" : ObjectId("5710ed8129c7f31530a537bc"),
    "Measurements" : [ 
        {
            "_t" : "Measurement",
            "_time" : ISODate("2016-04-14T12:31:52.584Z"),
            "Measurement1" : 1
            "Measurement2" : 2
            "Measurement3" : 3
        },
        {
            "_t" : "DataType",
            "_time" : ISODate("2016-04-14T12:31:52.584Z"),
            "Measurement1" : 4
            "Measurement2" : 5
            "Measurement3" : 6
        },
        {
            "_t" : "DataType",
            "_time" : ISODate("2016-04-14T12:31:52.584Z"),
            "Measurement1" : 7
            "Measurement2" : 8
            "Measurement3" : 9
        } ]
},
{
    "_id" : ObjectId("5710ed8129c7f31530a537cc"),
    "Measurements" : [ 
        {
            "_t" : "Measurement",
            "_time" : ISODate("2016-04-14T12:31:52.584Z"),
            "Measurement1" : 0
....

我想创建一个查询,将下面的数据集投影到下面的数据集中。例如,查询Measurement1并通过mongo聚合框架创建包含Measurement1(见下文)的时间和值的对象数组。

{ "Measurement": [
    {
        "Time": ISODate("2016-04-14T12:31:52.584Z"),
        "Value": 1
    }
    {
        "Time": ISODate("2016-04-14T12:31:52.584Z"),
        "Value": 4
    }
    {
        "Time": ISODate("2016-04-14T12:31:52.584Z"),
        "Value": 7
    }
]}

看起来像一个非常标准的操作,所以我希望你们能够对此有所了解。

1 个答案:

答案 0 :(得分:3)

您可以首先展开每个文档的Measurements数组,然后投影所需的字段,然后将它们重新组合在一起:

db.test.aggregate([
    // Duplicate each doc, once per Measurements array element
    {$unwind: '$Measurements'},
    // Include and rename the desired fields
    {$project: {
        'Measurements.Time': '$Measurements._time',
        'Measurements.Value': '$Measurements.Measurement1'      
    }},
    // Group the docs back together to reassemble the Measurements array field
    {$group: {
        _id: '$_id',
        Measurements: {$push: '$Measurements'}
    }}  
])