MongoDB查询:嵌套数组中至少一个元素warehouse字段非空的文档
MongoDB 查询:获取instock数组中至少有一个warehouse非null的文档
嘿,我来帮你搞定这个MongoDB的查询需求!你需要筛选出instock数组里至少有一个warehouse字段不为null的文档,同时排除掉所有instock元素的warehouse全是null的那条,对吧?
首先,先确认你提供的测试插入数据(我帮你补全了最后一条的内容):
db.inventory.insertMany([ { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] }, { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] }, { item: "planner", instock: [ { warehouse: null, qty: 40 }, { warehouse: "B", qty: 5 } ] }, { item: "postcard", instock: [ { warehouse: null, qty: 10 } ] } ])
两种可行的查询方法
你可以任选以下两种方式实现需求,效果完全一致:
方法1:用$elemMatch明确匹配数组元素
这种写法更直观,清晰表达“数组中至少有一个元素满足条件”的逻辑:
db.inventory.find({ instock: { $elemMatch: { warehouse: { $ne: null } } } })
方法2:简化的数组字段路径查询
MongoDB支持直接通过数组字段的路径进行查询,写法更简洁:
db.inventory.find({ "instock.warehouse": { $ne: null } })
为什么这两种方法能满足需求?
- 对于方法2,当你查询
"instock.warehouse": { $ne: null }时,MongoDB会自动遍历数组中的每个元素,只要有一个元素的warehouse不为null,整个文档就会被返回。 $elemMatch则是显式指定要匹配数组中的单个元素,这里就是要求数组里至少存在一个元素的warehouse不等于null,逻辑和方法2完全一致,只是可读性更强。
预期查询结果
执行上述任意一个查询后,你会得到前3个文档:
journal:两个warehouse都不为nullnotebook:唯一的warehouse为"C",不为nullplanner:虽然有一个warehouse是null,但另一个是"B",满足“至少一个非null”的条件
最后一条postcard文档会被排除,因为它的instock数组中所有元素的warehouse都是null,不符合筛选条件。
内容的提问来源于stack exchange,提问作者Ediel Cardona
相关产品推荐
相关产品推荐

