如何在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
相关产品推荐
相关产品推荐

