MongoDB-比较数组对象的字段

时间:2018-10-25 13:20:21

标签: mongodb mongodb-query

我需要找到所有文档,其中该文档中数组元素匹配其字段条件:

{
  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" ]}
    }
  }
}

如何正确比较数组对象中的字段?

2 个答案:

答案 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