Mongoose查询文档数组内符合条件元素时返回全部数据求助
问题原因
- 字段拼写错误:原文档数组内的团队字段是
team,你代码里写的mapItems.teamId匹配不到对应字段,条件直接失效。 - 普通
find的查询条件只能判断文档是否包含符合要求的数组成员,只要存在就返回完整文档,不会自动过滤数组内不符合要求的元素,所以你会拿到全部mapItems内容。
解决方案
使用MongoDB聚合操作,先筛选符合条件的文档,再过滤数组内容即可:
dyDB.aggregate([ // 筛选至少包含一个符合条件元素的文档,缩小后续处理范围 { $match: { mapItems: { $elemMatch: { team: "Alpha", teamIcon: { $in: [33, 52] } } } } }, // 过滤mapItems数组,仅保留符合要求的元素 { $project: { map: 1, Postcode: 1, mapItems: { $filter: { input: "$mapItems", as: "item", cond: { $and: [ { $eq: ["$$item.team", "Alpha"] }, { $in: ["$$item.teamIcon", [33, 52]] } ] } } } } }, // 可选:过滤掉筛选后mapItems为空的文档 { $match: { "mapItems.0": { $exists: true } } } ]).then((data) => { for (const dyn of data) { console.log(dyn); } });
补充说明
用$in: [33,52]代替原来的$or写法更简洁,$elemMatch保证匹配的是同一个数组元素同时满足两个条件,避免出现“一个元素team是Alpha、另一个元素teamIcon是33”也被误匹配的问题。
内容的提问来源于stack exchange,提问作者Yesman
相关产品推荐
相关产品推荐

