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

如何在MongoDB中提取soil_dryness字段与flavors数组内的name字段

MongoDB查询:提取指定字段与数组嵌套字段

示例文档

{
    _id: ObjectId("630fbb09cc9deb16a33fbcde"),
    firmness: {
      name: 'hard',
      url: 'https://pokeapi.co/api/v2/berry-firmness/3/'
    },
    flavors: [
      {
        flavor: {
          name: 'spicy',
          url: 'https://pokeapi.co/api/v2/berry-flavor/1/'
        },
        potency: 10
      },
      {
        flavor: {
          name: 'dry',
          url: 'https://pokeapi.co/api/v2/berry-flavor/2/'
        },
        potency: 0
      },
      {
        flavor: {
          name: 'sweet',
          url: 'https://pokeapi.co/api/v2/berry-flavor/3/'
        },
        potency: 0
      },
      {
        flavor: {
          name: 'bitter',
          url: 'https://pokeapi.co/api/v2/berry-flavor/4/'
        },
        potency: 0
      },
      {
        flavor: {
          name: 'sour',
          url: 'https://pokeapi.co/api/v2/berry-flavor/5/'
        },
        potency: 10
      }
    ],
    growth_time: 2,
    id: 20,
    item: { name: 'pinap-berry', url: 'https://pokeapi.co/api/v2/item/145/' },
    max_harvest: 10,
    name: 'pinap',
    natural_gift_power: 70,
    natural_gift_type: { name: 'grass', url: 'https://pokeapi.co/api/v2/type/12/' },
    size: 80,
    smoothness: 20,
    soil_dryness: 35
}

需求

提取soil_dryness字段,以及flavors数组中每个元素内的flavor.name字段。

错误尝试分析

你使用的命令:

db.Berries.find({},{soil_dryness:1},{"flavors.$":1}).pretty().limit(20)

存在两个问题:

  1. flavors.$仅能返回数组中第一个匹配查询条件的元素,无法提取所有元素的嵌套字段;
  2. 投影参数格式错误,所有投影规则应放在同一个对象中,而非拆分多个参数。

正确实现方法

方法1:基础投影语法(保留原数组结构)

直接通过点符号指定要保留的嵌套字段,MongoDB会自动保留数组中所有元素的目标字段:

db.Berries.find(
  {}, 
  { soil_dryness: 1, "flavors.flavor.name": 1, _id: 0 } // _id默认返回,可手动排除
).pretty().limit(20)

返回结果示例:

{
  "soil_dryness": 35,
  "flavors": [
    { "flavor": { "name": "spicy" } },
    { "flavor": { "name": "dry" } },
    { "flavor": { "name": "sweet" } },
    { "flavor": { "name": "bitter" } },
    { "flavor": { "name": "sour" } }
  ]
}

方法2:聚合管道(重组为简洁数组)

如果需要将所有口味名称提取为单独的数组,使用$project配合$map实现:

db.Berries.aggregate([
  { $limit: 20 },
  {
    $project: {
      soil_dryness: 1,
      flavor_names: { $map: { input: "$flavors", as: "f", in: "$$f.flavor.name" } },
      _id: 0
    }
  }
])

返回结果示例:

{
  "soil_dryness": 35,
  "flavor_names": ["spicy", "dry", "sweet", "bitter", "sour"]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:36:23