我需要找到所有文档,其中该文档中数组元素匹配其字段条件:
{
doc_id: 0,
array_field: [
{ id: 0, min: 1, max: 2 },
{ id: 1, min: 1, max: 1 },
...
]
}
...
我需要所有array_field
中任何对象具有max != min
的文档。
我一直在使用$elemMatch
来查询数组元素(它本身可以正常工作),但是我似乎无法使其与$expr
一起工作:
{
array_field: {
$elemMatch: {
$expr: { $ne: [ "$min", "$max" ]}
}
}
}
如何正确比较数组对象中的字段?
答案 0 :(得分:1)
db.collection.aggregate([
{"$match":{
"$expr":{
"$eq":[
{"$size":{"$setIntersection":["$min","$max"]}},
0
]
}
}},
{"$project":{"_id":1}}
])
$ setIntersection将FirstArrays名称与SecondArrays名称进行比较,并返回通用名称文档的数组,后跟$ size和$ redact,并将结果与0进行比较以保留或删除该文档。
答案 1 :(得分:1)
您不能将聚合运算符与查询运算符一起使用。您可以使用$setDifference
将min与max数组进行比较,并返回min数组中是否存在max数组中没有的元素。
将$expr
与$setDifference
一起使用。 $expr
允许在常规查找查询中使用聚合表达式。
类似
db.collection.find({
"$expr":{
"$ne":[
{"$size":{"$setDifference":["$array_field.min","$$array_field.max"]}},
0
]
}
}
)
当数组中有匹配的元素时,您还可以查看此处返回。
Comparing two object arrays and check if they have common elements