如何按对象数组的多组匹配条件筛选MongoDB文档
MongoDB 多组成对条件的或查询实现
你需要查询满足「id和address成对匹配」的条目,即要么id=1且address=UK,要么id=2且address=US,可以直接用MongoDB的$or操作符实现:
$or接收一个条件数组,数组内每个元素代表一组需要满足的条件,不同元素之间是**或(OR)**关系- 单个元素内的多个字段条件默认是**且(AND)**关系,刚好适配每组两个字段同时匹配的需求
固定条件的查询写法
把每组匹配条件作为$or数组的子对象即可,MongoDB Shell写法如下:
// 把yourCollectionName替换成你实际的集合名 db.yourCollectionName.find({ $or: [ { id: 1, address: "UK" }, { id: 2, address: "US" } ] })
注意:如果你的id字段是MongoDB默认生成的
_id字段,值需要用ObjectId()包装类型,从你给出的示例结构看id是自定义数字类型,直接传数字即可。
基于已有条件数组动态生成查询
如果你已经有题目里给出的结构化条件数组,不需要手动拆分重组,直接把数组传给$or参数即可:
// 你已有的条件数组 const conditionList = [{"id":1,"address":"UK"},{"id":2,"address":"US"}] db.yourCollectionName.find({ $or: conditionList })
这种写法可以适配任意长度的同类成对匹配条件,不需要每次修改查询结构。
避坑说明
不要用$in分别匹配两个字段的范围,比如下面的写法是错误的:
// 错误写法,逻辑为(id在[1,2]内) AND (address在["UK","US"]内) // 会额外匹配到id=1+address=US、id=2+address=UK这类不符合要求的条目 db.yourCollectionName.find({ id: { $in: [1, 2] }, address: { $in: ["UK", "US"] } })
这种写法没有绑定id和address的对应关系,查询结果会包含跨组合的无效数据,不符合需求。
内容的提问来源于stack exchange,提问作者Sherjil Malik
相关产品推荐
相关产品推荐

