我有这个集合
db.persone.find()
{
"_id" : ObjectId("5429b4bdd16acba384618d09"),
"nome" : "Alessio"
}
{
"_id" : ObjectId("5429b4bdd16acba384618d0a"),
"nome" : "Claudia"
}
{
"_id" : ObjectId("5429b4bdd16acba384618d0b"),
"nome" : "Barbara"
}
{
"_id" : ObjectId("5429b4bdd16acba384618d0c"),
"nome" : "Marco"
}
{
"_id" : ObjectId("5429b4bdd16acba384618d0d"),
"nome" : "Arianna"
}
如果我做
db.persone.find({nome:{$gt:'A'}})
我有相同的结果
如果我做
db.persone.find({nome:{$lt:'B'}})
我有这个结果
{
"_id" : ObjectId("5429b4bdd16acba384618d09"),
"nome" : "Alessio"
}
{
"_id" : ObjectId("5429b4bdd16acba384618d0d"),
"nome" : "Arianna"
}
与$lte
的结果相同。
我的问题是
为什么对于$lt
或$lte
,字母"B"不像$gt
那样包含?
在这种情况下,用$gt
代替$gte
和用$lt
代替$lte
有什么不同。
这里有一个关于这个主题的不错的教程。
基本上,它会按字典顺序比较字符串,一次比较一个字符,如果不确定,它会比较下一个字符。
在您的$gt
示例中,您给它比较的唯一字符是A
,但您可以将其视为存在一个隐藏的"终止"字符,所有字符都大于该字符。因此,如果你认为A
有第二个字符,比如n
(它实际上是一个空字符\u0000,但更难显示),那么在比较An
和Alession
时,它会比较A
和A
,无法确定,然后继续比较l
和n
,看到l
>n
,因此得出整个串CCD_ 23大于CCD_。
相反,对于$lt
运算符,当它将Bn
与Barbaran
进行比较时,它将达到比较a
<n
(记住终止字符总是较少),其求值为False
,因此Barbara
不小于B
。