Mongoose子文档属性过滤疑问:按federation的nom查询无结果
解决Mongoose子文档查询无结果的问题
你的过滤条件不正确,原因是直接给federation字段赋值{ nom: 'toto' }时,MongoDB会尝试匹配整个子文档完全等于该对象——也就是说,只有当某个Stage的federation字段恰好只包含nom: 'toto'这一个键,没有其他额外字段(比如groupeId、type)时,才会被命中。而你的Schema里federation还有其他可选字段,哪怕这些字段未赋值,只要文档中federation存在其他键,就匹配不上。
正确的查询写法
针对嵌套字段的查询,必须使用点表示法来指定子文档的具体字段:
// 写法1:直接定义过滤对象 const filter = { 'federation.nom': 'toto' }; // 写法2:动态赋值过滤条件 const filter = {}; filter['federation.nom'] = 'toto'; // 执行查询 const matchingStages = await Stage.find(filter);
补充说明
如果你的部分文档中federation确实只有nom字段,那之前的写法能匹配到这类文档,但只要federation包含其他字段(哪怕是null或未赋值的可选字段),就会匹配失败。使用点表示法可以精准定位子文档的单个字段,不会受其他字段影响。
内容的提问来源于stack exchange,提问作者Ricou
相关产品推荐
相关产品推荐

