MongoDB查询问题:筛选banco1且无box投资的银行文档
解决MongoDB查询问题:筛选指定银行且无特定投资项的文档
首先,咱们来拆解你的需求:你要找根级banco字段为"banco1",并且**investimentos数组里完全没有productName为"box"的投资项**的文档。你的原查询存在几个关键问题,咱们一步步修正:
原查询的问题分析
- 字段名不匹配:你写的是
"investments",但示例文档里的数组字段是"investimentos"(葡萄牙语拼写),这直接导致查询找不到目标数组。 - 逻辑方向错了:你把根级银行的筛选条件塞进了
$elemMatch里,这意味着你在找数组里有一个元素同时满足bank: "banco1"和productName: {$ne: "box"}——但你要的是整个文档属于banco1,且数组里彻底没有"box"这个投资项,完全不是一个逻辑。 - 语法小错误:
$ne条件里的"box"少了一个闭合引号,这也会让查询直接失效。
正确的查询语句
根据你的需求,这里有两种靠谱的写法:
方法1:$not + $elemMatch(逻辑更清晰,推荐)
这种写法明确表达:数组里不存在任何productName为"box"的元素,同时匹配根级银行字段:
db.banks.find({ "banco": "banco1", // 注意:如果你的实际文档里是"banco 1"(带空格),要改成对应值 "investimentos": { $not: { $elemMatch: { productName: "box" } } } })
方法2:$nin(写法更简洁)
如果productName是每个投资项都必有的字段,也可以用$nin来筛选:
db.banks.find({ "banco": "banco1", "investimentos.productName": { $nin: ["box"] } })
验证你的示例文档
针对你给出的两个示例:
- 第一个文档
banco是"banco 1",且数组里有productName: "box"的项,所以不会被查询返回。 - 第二个文档
banco是"banco2",不符合银行条件,也不会被返回。
要是有一个banco为"banco1"且数组里完全没有"box"的文档,就会被正确匹配到。
内容的提问来源于stack exchange,提问作者Luan Carvalho
相关产品推荐
相关产品推荐

