如何在不显式写入子字段名称的情况下检查某个字段的所有子字段中的所有元素?例如,我有一个这样的文档:
{"field": {"sub1": ["IC42", "IC38"], "sub2": ["BH90", "BH70"]}}
,我想要迭代所有子字段并检查其中是否有文本“IC42”
我不想使用 mongodb atlas 搜索,因为它会产生意想不到的结果
MongoDB 没有任何直接的方法来搜索对象的子属性/字段而不指定它们,
您可以在匹配阶段使用聚合运算符,如下所示,有多种方法可以使用聚合来执行此操作,但我不建议将其用于规模化项目,您可以使用带有数组的键值对来改进模式对象,它被称为 属性模式,就像我们通过
$objectToArray
运算符所做的那样,如下面的查询所示。
$objectToArray
将对象转换为键值对形式的对象数组。$filter
迭代对象数组并检查搜索/输入值是否在提供的数组中。$match
阶段使用$ne
运算符检查表达式条件,确保$filter
运算符的结果不应等于空数组[]。db.collection.aggregate([
{
$match: {
$expr: {
$ne: [
{
$filter: {
input: { $objectToArray: "$field" },
cond: { $in: ["IC42", "$$this.v"] }
}
},
[]
]
}
}
}
])