You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:54:21