如何在MongoDB聚合管道中使用$getField操作符实现动态路径取值?
问题原因
$getField 操作符只能直接获取单层级字段,没法解析带点号的嵌套路径字符串。你当前传的是 "address.city" 这个完整字符串,它会尝试从$$ROOT里找一个叫address.city的顶层字段,自然拿不到正确的嵌套值。
解决方法
需要先把路径字符串拆成字段名数组,再用$reduce结合$getField逐层遍历嵌套结构取值,同时保留fieldName字段:
db.collection.aggregate([ { $addFields: { fieldName: "address.city" } }, { $addFields: { fieldValue: { $reduce: { input: { $split: ["$fieldName", "."] }, initialValue: "$$ROOT", in: { $getField: { field: "$$this", input: "$$value" } } } } } } ])
代码说明
$split: ["$fieldName", "."]:把address.city拆成["address", "city"]数组$reduce:遍历这个数组,初始值是整个文档$$ROOT- 每次迭代用
$getField从当前的$$value(上一层的结果)里取出$$this(当前数组元素对应的字段)的值,最终得到嵌套字段address.city的内容
内容的提问来源于stack exchange,提问作者MayAsk
相关产品推荐
相关产品推荐

