我有这个集合
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
会有什么不同。
答案 0 :(得分:3)
关于这个主题here有一个不错的教程。
基本上,它会按字典顺序比较字符串,一次一个字符,如果不确定,它将比较下一个字符。
在你的$gt
示例中,您要比较的唯一字符是A
,但您可以将其视为隐藏的“终止”字符,表明一切都大于。因此,如果您将A
视为第二个字符,请说\n
(其实际上是空字符\ u0000,但更难显示),然后在A\n
的比较中Alessio\n
,它会将A
与A
进行比较,无法确定,然后继续比较l
与\n
并看到l
}> \n
,因此它得出的结论是整个字符串Alessio
大于A
。
相反,使用$lt
运算符,在将B\n
与Barbara\n
进行比较时,它将达到比较a
< \n
(请记住终止字符总是少),评估结果为False
,因此Barbara
不小于B
。