如何找到没有嵌入文档或数组元素符合条件的mongodb文档?

时间:2015-03-03 16:17:02

标签: mongodb mongodb-query

鉴于此:

{ _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的文档。是否有运算符执行此操作?

2 个答案:

答案 0 :(得分:2)

使用$not$or

db.test.find({ "results" : { 
    "$not" : { 
        "$elemMatch" : { 
            "$or" : [
                { "a" : { "$lt" : 80 } }, 
                { "b" : { "$lt" : 80 } } 
             ]
         } 
     } 
} })

对您的情况的否定是"文件中的某些结果ab值小于80"。我为此写了一个查询,并否定了它。鉴于查询处理数组元素的方式,我认为通常需要使用$not来强制执行每个数组元素的条件。

答案 1 :(得分:0)

是的,与$lt相反的是$gt,它返回具有大于指定值的特定属性的所有文档。

db.collection.find({results: {$elemMatch: { $and: [{a: {$gt: 79}}, {b: {$gt: 79}}]}}});

编辑:我进一步调查过,$elemMatch似乎只检查数组的第一个元素。我还检查了 wdberkeley 提供的解决方案,它按预期工作。除了由 wdberkeley 构建的查询之外,唯一的选择是使用聚合框架,但这比简单的查找查询要复杂得多。