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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:52:59