如何在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)
存在两个问题:
flavors.$仅能返回数组中第一个匹配查询条件的元素,无法提取所有元素的嵌套字段;- 投影参数格式错误,所有投影规则应放在同一个对象中,而非拆分多个参数。
正确实现方法
方法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
相关产品推荐
相关产品推荐

