MongoDB:如何合并多个文档中的数组元素?

时间:2019-04-09 20:32:26

标签: mongodb mongodb-query

我正在使用基于大小的存储方式在mongodb中存储从移动设备收集的传感器数据。由于mongodb的文档大小限制为16mb,因此我的数据会像这样分散在多个文档中。

文档1:

{
    "_id" : ObjectId("5ca411ad4fa0fa4c4893b025"),
    "experimentId" : ObjectId("5ca411ac4fa0fa4c4893b024"),
    "collectedData" : 
            [{
                    "pressure" : 125,
                    "lat" : 37.5
            },
            {
                    "pressure" : 155,
                    "lat" : 47.5
            },
            {
                    "pressure" : 128,
                    "lat" : 36.5,
            }]
}

文档2:

{
    "_id" : ObjectId("5cace327b322a8893df703b3"),
    "experimentId" : ObjectId("5ca411ac4fa0fa4c4893b024"),
    "collectedData" : [

            {
                    "pressure" : 124,
                    "lat" : 35.5
            },
            {
                    "pressure" : 115,
                    "lat" : 42.5
            },
            {
                    "pressure" : 15,
                    "lat" : 52.5
            }
    ]
}

请注意,为相同实验/任务创建的文档具有相同的“ experimentId”。

如何将多个文档中的“ collectedData”与相同的“ experimentId”组合在一起,以便以后可以将这些信息用于数据可视化?

我希望输出采用以下格式。

{
    "collectedData" : [
            {
                    "pressure" : 125,
                    "lat" : 37.5
            },
            {
                    "pressure" : 155,
                    "lat" : 47.5
            },
            {
                    "pressure" : 128,
                    "lat" : 36.5,
            },
            {
                    "pressure" : 124,
                    "lat" : 35.5
            },
            {
                    "pressure" : 115,
                    "lat" : 42.5
            },
            {
                    "pressure" : 15,
                    "lat" : 52.5
            }

    ]
}

1 个答案:

答案 0 :(得分:0)

您可以使用聚合框架来收集所有分散的阵列。但是,根据聚合后要投影的数据量,您仍然可能面临16 MB的限制。

Function MYUDF(SearchArea As Range, RowMatch As Range, ColumnMatch As Range)
    MYUDF = Application.Index(SearchArea, Application.Match(RowMatch, SearchArea.Resize(, 1), 0), Application.Match(ColumnMatch, SearchArea.Resize(1), 0))
End Function

您可能希望在应用程序代码中实现防呆解决方案。