MongoDB中如何通过字段值动态引用嵌套对象属性?
解决MongoDB动态访问对象属性的问题
嘿,我懂你的困扰!你现在是想利用之前生成的LeafNode字段值,动态去取CategoryDetails.VariableConfig里对应的属性值对吧?
为什么你原来的写法不生效?
你用'$CategoryDetails.VariableConfig.LeafNode'的时候,MongoDB会直接尝试访问VariableConfig下名为LeafNode的固定属性,但你的文档里VariableConfig根本没有这个键,自然拿不到预期的B。要实现动态引用字段值作为键,得用MongoDB提供的动态字段访问操作符。
方案1:使用$getField(MongoDB 5.0+推荐)
这个操作符专门用来动态获取对象的属性,非常直观:
{ '$project': { 'PageNameDetails': { '$getField': { 'field': '$LeafNode', // 用$LeafNode引用之前生成的字段值作为键名 'input': '$CategoryDetails.VariableConfig' // 要访问的目标对象 } } } }
它会直接把LeafNode的值(也就是AB)作为键,从VariableConfig里取出对应的值B。
方案2:兼容低版本的$objectToArray+$filter
如果你的MongoDB版本低于5.0,可以用对象转数组的方式实现:
{ '$project': { 'PageNameDetails': { '$arrayElemAt': [ { '$map': { 'input': { '$filter': { 'input': { '$objectToArray': '$CategoryDetails.VariableConfig' }, // 把对象转成[{k:'AB',v:'B'}, ...]的数组 'cond': { '$eq': ['$$this.k', '$LeafNode'] } // 过滤出键等于LeafNode的项 } }, 'in': '$$this.v' // 提取匹配项的value } }, 0 // 取数组里的第一个(也是唯一的)结果 ] } } }
这个流程是把对象拆成键值对数组,筛选出对应键的项,再提取它的值。
两种方法都能帮你得到预期的输出B,根据你的MongoDB版本选就行~
内容的提问来源于stack exchange,提问作者sindhu
相关产品推荐
相关产品推荐

