MongoDB不等于不等于相反

时间:2016-02-21 12:28:16

标签: mongodb mongodb-query

如果我运行以下内容:

db.restaurants.find({'grades.grade': 'A'}, {'grades.grade':1})

然后我返回所有成绩为'A'的文件。那就是,至少有一个'A'的任何文件,但可能还有其他等级。 e.g:

{
    "_id" : ObjectId("56c9a7038cc7f52917313091"),
    "grades" : [ 
        {
            "grade" : "A"
        }, 
        {
            "grade" : "B"
        }, 
        {
            "grade" : "A"
        }, 
        {
            "grade" : "A"
        }
    ]
}

如果我使用$ne运算符:

db.restaurants.find({'grades.grade': {$ne: 'A'}}, {'grades.grade':1})

然后我返回所有所有成绩不等于'A'的文件。

e.g。

{
    "_id" : ObjectId("56c9a7038cc7f52917313245"),
    "grades" : [ 
        {
            "grade" : "B"
        }, 
        {
            "grade" : "B"
        }, 
        {
            "grade" : "C"
        }, 
        {
            "grade" : "B"
        }, 
        {
            "grade" : "B"
        }
    ]
}

$ne为什么匹配所有成绩,但等于匹配任何成绩?

  

注意:在$in ans $nin中似乎也是如此。 $in匹配任何文档,而$nin匹配所有文档。

     

NB2:$not也表现出这种行为。

2 个答案:

答案 0 :(得分:1)

我理解你的问题,我同意从功能的角度来看你是对的:应该有一种方法来“否定”equals的方式在逻辑上“给我任何包含非东西的东西” A”。

但我认为Mongo的工作方式从形式逻辑的角度来看是有道理的。如果您从逻辑上考虑它,那么查询db.restaurants.find({'grades.grade': 'A'})将返回

(grades[0].grade == 'A' || grades[1].grade == 'A' || grades[2].grade == 'A'|| grades[3].grade == 'A'...)

基本形式逻辑表明上述陈述的否定是

(grades[0].grade != 'A' && grades[1].grade != 'A' && grades[2].grade != 'A'&& grades[3].grade != 'A'...)

这正是您使用$ne获得的。

答案 1 :(得分:0)

这是基本的De Morgan逻辑否定的结果。

NOT(A和B)表示(不是A)或(不是B)

这可以直接翻译成集理论,其中析取(OR)表示联合和结合(AND)表示交集。

当你申请等于你时,你要求任何匹配的值(分离)。但是当你否定这一点时,你会根据De Morgan否定每一场比赛。