嵌套MongoDB查询在Compass可用但在Mongoose中失效
问题原因与解决方案
你的查询返回null是因为查询条件写法错误:当前代码里的{ toreward: { highest: ... } }是在匹配toreward数组完全等于这个单个对象,但实际你的toreward是包含该对象的数组,所以无法匹配到目标文档。
正确的查询写法
要匹配数组中嵌套对象的指定字段,需要使用点符号来定位嵌套路径:
const highestt = await scanmodel.findOne({ "toreward.highest": scans[0].toreward[0].highest });
为什么原写法不生效?
MongoDB中,{ toreward: { highest: X } }这种写法会严格匹配toreward数组的整体内容——要求数组恰好是[{ highest: X }],元素数量、顺序、字段完全一致才会命中。而你的需求是找到数组中存在至少一个元素的highest字段等于目标值的文档,点符号的写法会自动遍历数组元素进行匹配,这才是符合你场景的逻辑。
修改后效果
调整查询条件后,highestt会正确返回你插入的那条文档,因为它匹配到了toreward数组中存在对应highest值的条件。
内容的提问来源于stack exchange,提问作者Unstay Anon
相关产品推荐
相关产品推荐

