Mongoose查询问题:如何筛选包含全部指定ObjectId的Spice文档
解决MongoDB数组多ObjectId匹配问题
你的问题核心在于用错了查询操作符:$in是用来匹配数组中包含任意一个指定值的文档,但你需要的是找到blends数组同时包含所有传入ObjectId的文档,这时候得用$all操作符才行。
正确的实现代码
把查询条件替换成$all就能得到你想要的结果:
const spicesQuery = Spice.find(); // 使用$all确保blends数组包含所有传入的ObjectId spicesQuery.where({ blends: { $all: query.blends } }); // 别忘了加await,否则拿到的是Promise对象 const spices = await spicesQuery.sort({ name: 1 }).exec(); console.log(spices);
几个额外的小提示
- 一定要在
exec()前加上await,不然你打印的会是未resolved的Promise,而不是实际的查询结果 - 前端传入的是字符串格式的ID,Mongoose会自动帮你转换成
mongoose.Types.ObjectId类型,一般不需要手动处理;如果遇到类型不匹配的问题,可以手动转换:const objectIds = query.blends.map(id => mongoose.Types.ObjectId(id)); spicesQuery.where({ blends: { $all: objectIds } });
为什么原来的代码会返回所有文档?
$in的匹配逻辑是"只要数组里有任意一个指定值就匹配",所以只要某个Spice文档的blends数组包含你传入的两个ID中的任意一个,就会被查询出来,这就导致你拿到了所有符合部分条件的文档,而非全部条件的。而$all会严格检查数组是否包含所有指定的元素,正好契合你的需求。
内容的提问来源于stack exchange,提问作者Iqbal
相关产品推荐
相关产品推荐

