MongoDB: Как объединить элементы массива из нескольких документов? - PullRequest
0 голосов
/ 09 апреля 2019

Я храню данные датчиков, собранные с мобильных устройств в mongodb, используя подход, основанный на размерах.Поскольку у mongodb есть ограничение в 16 МБ на размер документа, мои данные распределяются по нескольким документам, как это.

Документ 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
            }
    ]
}

Обратите внимание, что документы, созданные для одного и того же эксперимента / задачи, имеют один и тот же «экспериментальный идентификатор».

Как мне объединить "собираемые данные" из нескольких документов с одним и тем же "экспериментальным идентификатором", чтобы впоследствии я мог использовать эту информацию для визуализации данных?

Я ожидаю, что выходные данные будут в формате ниже.

{
    "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 голосов
/ 09 апреля 2019

Вы можете использовать структуру агрегации для сбора всех разбросанных массивов. Однако вы все равно можете столкнуться с ограничением в 16 МБ в зависимости от объема данных, которые вы проецируете после агрегирования.

db.getCollection("your_collection_name").aggregate(
    [
        { 
            "$unwind" : {
                "path" : "$collectedData"
            }
        }, 
        { 
            "$group" : {
                "_id" : "$experimentId", 
                "collectedData" : {
                    "$addToSet" : "$collectedData"
                }
            }
        }
    ], 
    { 
        "allowDiskUse" : true
    }
);

Возможно, вы захотите сделать это в коде приложения для надежного решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...