MongoDB查询嵌套数组时如何仅返回符合条件的匹配对象
问题解答
该需求完全可以实现。
你之前查询返回完整文档的核心原因是:MongoDB普通查询的默认匹配逻辑为,只要文档内任意字段、任意数组成员满足查询条件,就会返回整个完整文档,不会自动裁剪数组内的不匹配项。要实现仅返回数组中符合条件的对象,可根据实际场景选择对应操作方法:
方法1:find 投影搭配 $elemMatch(支持MongoDB 2.2及以上版本,仅返回首个匹配的数组成员)
如果你确认people数组内最多只有1个age为24的对象,可直接在find方法的第二个参数(投影配置)中使用$elemMatch指定数组匹配规则,示例代码如下:
// 将yourCollection替换为你实际使用的集合名 db.yourCollection.find( { "people.age": { $in: [24] } }, { people: { $elemMatch: { age: 24 } }, _id: 0 // 不需要返回_id字段可保留该行,需要则删除 } )
注意:该方法仅会返回people数组中第一个满足age=24的对象,如果数组内存在多个符合条件的对象,其余匹配项不会被返回。
方法2:聚合管道搭配 $filter(支持MongoDB 3.2及以上版本,返回所有匹配的数组成员)
如果people数组中可能存在多个age为24的对象,需要返回全部匹配项,可使用聚合管道的$filter操作符遍历数组做过滤,示例代码如下:
// 将yourCollection替换为你实际使用的集合名 db.yourCollection.aggregate([ // 第一步:筛选出存在符合条件的people元素的文档 { $match: { "people.age": { $in: [24] } } }, // 第二步:过滤people数组,仅保留满足条件的对象 { $project: { people: { $filter: { input: "$people", // 指定要过滤的数组字段 as: "person", // 遍历数组时的临时变量名,可自定义 cond: { $eq: ["$$person.age", 24] } // 元素匹配规则 } }, _id: 0 // 不需要返回_id字段可保留该行,需要则删除 } } ])
执行对应语句后,返回结果中的people数组将仅保留age值为24的匹配对象,不会返回其余不满足条件的数组成员。
内容的提问来源于stack exchange,提问作者jonson
相关产品推荐
相关产品推荐

