MongoDB聚合$project阶段如何通过动态键获取对象值
动态键对象值的检索解决方案
你当前的写法$price.currency会将currency视为price对象的固定键名,而非引用文档中currency字段的实际值,所以返回空数据。以下是几种可行的解决方案:
方案1:MongoDB 5.0+ 推荐写法($getField)
直接使用$getField运算符,通过字段值动态获取对象属性,写法最简洁:
db.collection.aggregate([ { "$project": { "pricenew": { "$getField": { "field": "$currency", "input": "$price" } } } } ])
方案2:低版本兼容写法(MongoDB 3.4+)
如果使用5.0以下版本,可先将对象转为键值对数组,再筛选匹配:
db.collection.aggregate([ { "$project": { "priceArray": { "$objectToArray": "$price" }, "currency": 1 } }, { "$project": { "pricenew": { "$arrayElemAt": [ { "$filter": { "input": "$priceArray", "cond": { "$eq": ["$$this.k", "$currency"] } } }, 0 ] } } }, { "$project": { "pricenew": "$pricenew.v" } } ])
说明:$objectToArray把price转成[{k: "INR", v: 45.99}]格式,$filter匹配键名等于currency值的元素,最后提取对应的值。
方案3:更简洁的低版本写法(MongoDB 3.2+)
借助$let和数组索引定位,减少聚合阶段:
db.collection.aggregate([ { "$project": { "pricenew": { "$let": { "vars": { "keys": { "$objectToArray": "$price" } }, "in": { "$arrayElemAt": [ "$$keys.v", { "$indexOfArray": ["$$keys.k", "$currency"] } ] } } } } } ])
内容的提问来源于stack exchange,提问作者Sohan
相关产品推荐
相关产品推荐

