【问题标题】:Mongodb: how to "flatten" some query resultsMongodb:如何“扁平化”一些查询结果
【发布时间】:2020-06-12 23:56:10
【问题描述】:

帮助在查询中“扁平化”(将嵌套字段与文档字段拉到同一级别)一个 mongodb 文档

//this is "anagrafiche" collection
[{
 "name": "tizio"
,"surname": "semproni"
,"birthday": "01/02/1923"
,"home": {
     "road": "via"
    ,"roadname": "bianca"
    ,"roadN": 12
        ,"city": "rome"
        ,"country": "italy"
        }
},
{
 "name": "caio"
,"surname": "giulio"
,"birthday": "02/03/1932"
,"home": {
     "road": "via"
    ,"roadname": "rossa"
    ,"roadN": 21
        ,"city": "milan"
        ,"country": "italy"
        }
},
{
 "name": "mario"
 ,"surname": "rossi"
// birthday is not present for this document
,"home": {
     "road": "via"
    ,"roadname": "della pace"
    ,"roadN": 120
        ,"city": "rome"
        ,"country": "italy"
        }
}
]

我的查询:

db.anagrafiche.aggregate([  {$match {"home.city": "rome"}}
                {$project:{"name": 1, "surname":1, <an expression to flatten the address>, "birthday": 1, "_id":0}}
             ]
);

预期结果:

{
    ,"name": "tizio"
    ,"surname": "semproni"
    ,"address": "via bianca 12 rome"
    ,"birthday": 01/02/1923
},{
    ,"name": "mario"
    ,"surname": "rossi"
    ,"address": "via della pace 120 rome"
    ,"birthday": NULL
}

【问题讨论】:

    标签: database mongodb aggregation-framework


    【解决方案1】:

    您可以使用$objectToArray 获取嵌套的文档键和值,然后使用$reduce$concat 动态连接值:

    db.collection.aggregate([
        {
            $project: {
                _id: 0,
                name: 1,
                surname: 1,
                birthday: 1,
                address: {
                    $reduce: {
                        input: { $objectToArray: "$home" },
                        initialValue: "",
                        in: {
                            $concat: [
                                "$$value",
                                { $cond: [ { $eq: [ "$$value", "" ] }, "", " " ] },
                                { $toString: "$$this.v" }
                            ]
                        }
                    }
                }
            }
        }
    ])
    

    Mongo Playground

    【讨论】:

    • $arrayToObject 还是 $objectToArray?
    • 另外:为什么是双美元符号$$?访问$$value$$this.v 时没有一个$?它也在文档中使用,但没有解释原因。
    • 单美元指一个字段,双美元指一个变量,$reduce引入两个变量$$value(状态)和$$this(当前处理的元素)
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 2020-07-03
    • 2018-09-27
    • 1970-01-01
    • 2017-10-31
    • 2014-04-08
    • 2013-06-09
    相关资源
    最近更新 更多