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

如何在MongoDB聚合查询中选取键名存于值中的字段?

动态根据category值获取对应字段的实现方法

针对你给出的文档结构,要实现根据category的动态值获取products中对应键的字段,我分两种常见场景给你解决方案:

一、JavaScript/Node.js中处理已获取的文档数据

如果已经把文档数据拿到了前端或者Node.js代码里,直接用方括号语法就能实现动态属性访问,这是JS里处理动态键最直接的方式:

// 假设你的文档数据存在这个变量里
const doc = {
  "_id": "5de23837d7231325d0e3f9ad",
  "status": "cancelled",
  "createdAt": "2019-11-30T09:36:09.712Z",
  "user": "5d73677739be3a2340870dd2",
  "platform": "ios",
  "products": {
    "discount": 88,
    "_id": "5de23811014f0209345b54ef",
    "roomArrangement": [],
    "category": "adventure",
    "adventure": {
      "title": "This is high1",
      "location": {
        "code": "code",
        "name": "Manali",
        "state": { "code": "123", "name": "state", "slug": "state" }
      }
    }
  }
};

// 1. 先拿到category的值
const categoryKey = doc.products.category;
// 2. 用方括号访问动态键对应的字段
const targetField = doc.products[categoryKey];

console.log(targetField);
// 输出结果就是products.adventure的内容:
// { title: 'This is high1', location: { ... } }

核心逻辑就是:点语法只能访问固定键,方括号语法可以用变量作为键名,完美适配这种动态场景。

二、MongoDB数据库层面直接查询返回目标字段

如果想在数据库查询阶段就直接返回需要的字段,而不是拿到整个文档再处理,可以用MongoDB的聚合框架来实现:

方法1:通用版本(适配所有MongoDB版本)

利用$objectToArray把products对象转成键值对数组,再筛选出键名等于category的项,最后转回对象:

db.collection.aggregate([
  // 匹配目标文档(可选,根据你的查询条件调整)
  { $match: { _id: ObjectId("5de23837d7231325d0e3f9ad") } },
  {
    $project: {
      // 把products转成[{k: "键名", v: "值"}]的数组
      productsArray: { $objectToArray: "$products" },
      // 保留其他需要的字段,或者按需添加
      status: 1,
      createdAt: 1
    }
  },
  {
    $project: {
      // 筛选出k等于category的项
      targetField: {
        $arrayElemAt: [
          {
            $filter: {
              input: "$productsArray",
              cond: { $eq: ["$$this.k", "$productsArray.v.category"] }
            }
          },
          0
        ]
      },
      status: 1,
      createdAt: 1
    }
  },
  {
    $project: {
      // 提取出v字段,就是我们要的目标内容
      targetField: "$targetField.v",
      status: 1,
      createdAt: 1
    }
  }
])

方法2:MongoDB 4.4+版本简化写法

如果你的MongoDB版本是4.4及以上,可以用$getField来直接获取动态键,写法更简洁:

db.collection.aggregate([
  { $match: { _id: ObjectId("5de23837d7231325d0e3f9ad") } },
  {
    $project: {
      targetField: { $getField: { field: "$products.category", input: "$products" } },
      status: 1,
      createdAt: 1
    }
  }
])

这个聚合查询会直接返回targetField字段,就是你需要的products.adventure的内容。


内容的提问来源于stack exchange,提问作者Rakesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:12:44