如果我运行以下内容:
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
也表现出这种行为。
答案 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否定每一场比赛。