首页 > 解决方案 > 如何在分组条件下合并文档并在 mongo 集合中创建新字段?

问题描述

这是 mongo db 集合中的数据迁移。

这是 mongo db 集合中的数据迁移。在下面的代码中,我有一些文件。在 common field1 的基础上,将所有文档分组合并为一个文档。在新的合并文档中,我想要一个新的 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”:“a”},{
“field2”:“1100”,“场 3":"b" }, {
"场2":"0099", "场3":"c" } ] }

标签: mongodbrobo3t

解决方案


您可以使用聚合管道$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"
                }
        ]
}
>

编辑-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"
                }
        ]
}
>

推荐阅读