Как объединить документы по условию группировки и создать новое поле в коллекции mongo? - PullRequest
0 голосов
/ 08 января 2019

Это миграция данных в коллекции mongo db.

Это миграция данных в коллекции mongo db. В приведенном ниже коде у меня есть некоторые документы. На основе общего поля1 все документы должны быть сгруппированы и объединены в один документ. В новом объединенном документе я хочу новое поле field4, которое фактически является списком объектов field2 и field3 из группы. И поля field2 и field3 не должны быть там в одном объединенном документе.

Таким образом, количество документов в коллекции будет уменьшено на основе уникального поля1.

Документ 1 { "field1": "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2": "9911", "field3": "a" }

Документ 2 { "field1": "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2": "1100", "field3": "b" }

Документ 3 { "field1": "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2": "0099", "field3": "c" }

Ожидаемый результат

должен быть 1 документ в формате

{
"Field1": "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "Field4": [
{
"Field2": "9911", "Field3": "а" }, {
"Поле2": "1100", "Field3": "б" }, {
"Field2": "0099", "Field3": "С" } ] }

1 Ответ

0 голосов
/ 08 января 2019

Вы можете использовать агрегационный конвейер с $group и $push

Агрегационный трубопровод

db.t41.aggregate([
    {$group : {
        _id : "$field1", 
        field4 : {$push : {field2 : "$field2", field3 : "$field3"}}
    }},
    {$project : {_id : 0, field1 : "$_id", field4 : "$field4"}}
]).pretty()

коллекция

> db.t41.find()
{ "_id" : ObjectId("5c34260a4ffb628e45e69c00"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "9911", "field3" : "a" }
{ "_id" : ObjectId("5c34260a4ffb628e45e69c01"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "1100", "field3" : "b" }
{ "_id" : ObjectId("5c34260a4ffb628e45e69c02"), "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978", "field2" : "0099", "field3" : "c" }
>

результат

> db.t41.aggregate([{$group : {_id : "$field1", field4 : {$push : {field2 : "$field2", field3 : "$field3"}}}}, {$project : {_id : 0, field1 : "$_id", field4 : "$field4"}}]).pretty()
{
        "field1" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978",
        "field4" : [
                {
                        "field2" : "9911",
                        "field3" : "a"
                },
                {
                        "field2" : "1100",
                        "field3" : "b"
                },
                {
                        "field2" : "0099",
                        "field3" : "c"
                }
        ]
}
>

EDIT-1

это работает без жесткого кодирования клавиш

db.t41.aggregate([
    {$group : { _id : "$field1", data : {$push : {$objectToArray : "$$ROOT"}}}}, 
    {$addFields : {data : {$map : {input : "$data", as : "d", in : {$arrayToObject : {$slice : ["$$d", 2, {$size : "$$d"}]}}}}}}
]).pretty()

конвейер агрегации

> db.t41.aggregate([{$group : { _id : "$field1", data : {$push : {$objectToArray : "$$ROOT"}}}}, {$addFields : {data : {$map : {input : "$data", as : "d", in : {$arrayToObject : {$slice : ["$$d", 2, {$size : "$$d"}]}}}}}}]).pretty()
{
        "_id" : "e8b0f2b5-de4a-4449-b2aa-15f009ac4978",
        "data" : [
                {
                        "field2" : "9911",
                        "field3" : "a"
                },
                {
                        "field2" : "1100",
                        "field3" : "b"
                },
                {
                        "field2" : "0099",
                        "field3" : "c"
                }
        ]
}
>
...