MongoDB带逻辑限定的嵌套数组按ID查询方法咨询
MongoDB 二维嵌套数组按ID匹配查询实现方案
场景说明
你的数据结构为:
- 顶层字段
arr是二维数组,子数组之间为AND匹配关系,子数组内部元素为OR匹配关系 - 子数组内每个元素的结构为:
{ "foo":{ "$oid":"615469ac6187ab0c8613b7b6"}, "score":25 }
- 查询要求:
arr同时满足(子数组1内有任意元素匹配指定ID)AND(子数组2内有任意元素匹配指定ID)AND ... 以此类推。
通用无顺序要求实现(推荐)
使用$all+$elemMatch组合即可实现,$all保证多个子数组条件的AND关系,$elemMatch+$in实现单个数组内的OR匹配。
示例查询:假设需要满足(ID1或ID2)AND(ID3或ID4)AND ID5 AND ID6的规则,查询语句如下:
db.your_collection_name.find({ arr: { $all: [ // 第一个子数组的OR条件 { $elemMatch: { "foo.$oid": { $in: ["615469ac6187ab0c8613b7b6", "615469ac6187ab0c8613b7b7"] } } }, // 第二个子数组的OR条件 { $elemMatch: { "foo.$oid": { $in: ["615469ac6187ab0c8613b7b8", "615469ac6187ab0c8613b7b9"] } } }, // 单个ID的条件等价于OR只有一个选项 { $elemMatch: { "foo.$oid": "615469ac6187ab0c8613b7ba" } }, { $elemMatch: { "foo.$oid": "615469ac6187ab0c8613b7bb" } } ] } })
严格匹配子数组顺序实现
如果要求$all里的条件必须按顺序对应arr的第N个子数组,使用$expr配合下标访问实现:
db.your_collection_name.find({ $expr: { $and: [ // 匹配arr第一个子数组的OR条件 { $gt: [{ $size: { $filter: { input: "$arr.0", cond: { $in: ["$$this.foo.$oid", ["615469ac6187ab0c8613b7b6", "615469ac6187ab0c8613b7b7"]] } } } }, 0] }, // 匹配arr第二个子数组的OR条件 { $gt: [{ $size: { $filter: { input: "$arr.1", cond: { $in: ["$$this.foo.$oid", ["615469ac6187ab0c8613b7b8", "615469ac6187ab0c8613b7b9"]] } } } }, 0] }, // 匹配arr第三个子数组的单ID条件 { $in: ["615469ac6187ab0c8613b7ba", "$arr.2.foo.$oid"] }, // 匹配arr第四个子数组的单ID条件 { $in: ["615469ac6187ab0c8613b7bb", "$arr.3.foo.$oid"] } ] } })
注意事项
如果你的foo字段是MongoDB原生ObjectId类型,不是带$oid的JSON结构化存储,将查询条件里的"foo.$oid"改为foo,ID值替换为ObjectId("你的ID字符串")即可。
内容的提问来源于stack exchange,提问作者Rohin1212
相关产品推荐
相关产品推荐

