如何通过Mongo查询获取对象数组中符合匹配条件的指定元素
你之前的写法均属于文档匹配逻辑,仅能筛选出「数组中至少包含一个符合条件元素的文档」,不会对返回结果中的数组内容做过滤,因此会返回整个books数组。
方案1:仅返回数组中第一个匹配的元素
如果你只需要拿到第一个符合条件的数组成员,直接在find的投影参数中使用$位置运算符即可:
dbCollection.find( { user: req.user._id, "books.type": type }, // 第二个参数为投影配置,指定需要返回的字段 { user: 1, "books.$": 1 } )
方案2:返回数组中所有匹配的元素
如果需要筛选出数组中全部符合条件的元素,需要使用聚合管道结合$filter操作符实现:
dbCollection.aggregate([ // 第一步:先筛选符合条件的文档,减少后续计算量 { $match: { user: req.user._id, "books.type": type } }, // 第二步:过滤books数组,仅保留type匹配的元素 { $addFields: { books: { $filter: { input: "$books", as: "book", cond: { $eq: ["$$book.type", type] } } } } } ])
上述代码中$addFields会保留文档所有原有字段,仅更新books字段为过滤后的结果;如果你只需要返回特定字段,可以替换为$project操作符自定义返回结构。
内容的提问来源于stack exchange,提问作者Faisal Jamil Khan
相关产品推荐
相关产品推荐

