MongoDB查询gcp_price_list中含VMIMAGE子串的对象
查询MongoDB中gcp_price_list内名称含"VMIMAGE"的对象
看起来你已经成功把GCP价格列表导入MongoDB并能输出数据了,现在要筛选出gcp_price_list里所有键名包含"VMIMAGE"的对象对吧?这里因为gcp_price_list是嵌套的键值对象(而非数组),普通的find查询没法直接过滤键名,得用MongoDB的聚合管道来处理,具体方案如下:
核心思路
我们需要先把gcp_price_list这个对象转换为键值对数组,这样就能对每个键名进行匹配过滤,最后再根据需求把结果整理回对象格式。
具体代码实现
把你原来的find查询替换成聚合管道操作,在app.js里可以这么写:
db.googlepricelist.aggregate([ // 第一步:将gcp_price_list对象转为[{k: 键名, v: 对应值}]格式的数组 { $project: { vmImageEntries: { $objectToArray: "$gcp_price_list" } } }, // 第二步:展开数组,让每个键值对成为独立文档,方便后续过滤 { $unwind: "$vmImageEntries" }, // 第三步:过滤键名包含"VMIMAGE"的条目(正则表达式支持模糊匹配) { $match: { "vmImageEntries.k": /VMIMAGE/ } }, // 第四步:将过滤后的键值对重新组合成对象(可选,根据你的输出需求调整) { $group: { _id: "$_id", filteredVmImages: { $push: { k: "$vmImageEntries.k", v: "$vmImageEntries.v" } } } }, { $project: { filteredVmImages: { $arrayToObject: "$filteredVmImages" }, _id: 0 } } ]) .pipe(JSONStream.stringify()) .pipe(res);
各步骤说明
$objectToArray:把gcp_price_list这个对象拆分成键值对数组,这是处理对象键名过滤的关键一步,因为MongoDB的查询操作更擅长处理数组结构。$unwind:将数组拆分为单个文档,这样我们就能对每个键值对单独应用匹配条件。$match:使用正则表达式/VMIMAGE/匹配键名包含"VMIMAGE"的条目,如果需要不区分大小写匹配,可以改成/VMIMAGE/i。$group+$arrayToObject:把过滤后的键值对数组重新组合成对象格式,让输出结构更贴近你原来的gcp_price_list结构,如果你只需要键值对列表,可以省略这两步。
简化版(仅输出键值对列表)
如果不需要整理成对象,只需要获取所有包含VMIMAGE的键值对,也可以简化聚合管道:
db.googlepricelist.aggregate([ { $project: { vmImageEntries: { $objectToArray: "$gcp_price_list" } } }, { $unwind: "$vmImageEntries" }, { $match: { "vmImageEntries.k": /VMIMAGE/ } }, { $project: { key: "$vmImageEntries.k", value: "$vmImageEntries.v", _id: 0 } } ]) .pipe(JSONStream.stringify()) .pipe(res);
这样输出的就是每个匹配项的键和值的列表,方便直接使用。
内容的提问来源于stack exchange,提问作者K. Tilman
相关产品推荐
相关产品推荐

