MongoDB查询嵌套字典字段:匹配任意家庭成员州为Hawaii的文档
MongoDB嵌套字典字段的匹配问题解答
你的通配符写法不可行
MongoDB的查询语法不支持使用*作为通配符匹配嵌套对象的所有键,所以db.users.find({'family_member.*.address.state': "Hawaii"})这种写法无法得到预期结果。
无需编写多个匹配条件的解决方案
你可以利用MongoDB的聚合表达式实现动态匹配嵌套字典中的所有成员,不需要枚举每个家庭成员的键:
方法1:使用$objectToArray + $filter(适配所有支持聚合表达式的MongoDB版本)
db.users.find({ $expr: { $gt: [ { $size: { $filter: { input: { $objectToArray: "$family_member" }, cond: { $eq: ["$$this.v.address.state", "Hawaii"] } } } }, 0 ] } })
- 逻辑说明:
$objectToArray将family_member嵌套字典转换为键值对数组,格式为[{k: "mother", v: {...}}, {k: "father", v: {...}}, ...]$filter遍历数组,筛选出v.address.state等于"Hawaii"的元素$size获取筛选结果的长度,只要长度大于0,就说明文档中存在符合条件的家庭成员
方法2:使用$anyElementTrue(MongoDB 5.0+版本可用)
db.users.find({ $expr: { $anyElementTrue: { $map: { input: { $objectToArray: "$family_member" }, in: { $eq: ["$$this.v.address.state", "Hawaii"] } } } } })
- 逻辑说明:
$map将每个家庭成员对象转换为布尔值(判断其address.state是否为"Hawaii")$anyElementTrue检查数组中是否存在至少一个true,存在则匹配该文档
为什么不推荐多个$or条件?
如果手动写$or枚举所有家庭成员的键(比如family_member.mother.address.state: "Hawaii"、family_member.father.address.state: "Hawaii"),不仅繁琐,而且当后续新增家庭成员键(如sister)时,需要修改查询语句,扩展性极差。上面的聚合表达式方案可以自适应family_member下的所有键,无需修改代码。
内容的提问来源于stack exchange,提问作者sinhyperbolica
相关产品推荐
相关产品推荐

