鉴于此:
{ _id: 1, results: [ {a: 82, b: 81}, {a: 82, b: 88} ] }
{ _id: 2, results: [ {a: 82, b: 90}, {a: 82, b: 33} ] }
我想找到没有结果的文档,其中a或b小于80.(本例中为doc 1)我知道我可以使用$ elemMatch查找包含任何结果的文档a或b小于80.有没有办法反过来?
或者,我可以重写我的条件来查找所有结果的a和b大于79的文档。是否有运算符执行此操作?
答案 0 :(得分:2)
使用$not
和$or
:
db.test.find({ "results" : {
"$not" : {
"$elemMatch" : {
"$or" : [
{ "a" : { "$lt" : 80 } },
{ "b" : { "$lt" : 80 } }
]
}
}
} })
对您的情况的否定是"文件中的某些结果a
或b
值小于80"。我为此写了一个查询,并否定了它。鉴于查询处理数组元素的方式,我认为通常需要使用$not
来强制执行每个数组元素的条件。
答案 1 :(得分:0)
是的,与$lt
相反的是$gt
,它返回具有大于指定值的特定属性的所有文档。
db.collection.find({results: {$elemMatch: { $and: [{a: {$gt: 79}}, {b: {$gt: 79}}]}}});
编辑:我进一步调查过,$elemMatch
似乎只检查数组的第一个元素。我还检查了 wdberkeley 提供的解决方案,它按预期工作。除了由 wdberkeley 构建的查询之外,唯一的选择是使用聚合框架,但这比简单的查找查询要复杂得多。