2014-09-29 22 views
1

我有這個集合

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

你總是需要檢查第一個字符嗎?謝謝。 – alecxe 2014-09-29 20:27:07

回答

3

有一個體面的教程here

基本上,它會按字母順序比較字符串,一次一個字符,如果這是不確定的,它會比較下一個字符。

在你的$gt例子中,你要給它比較的唯一字符是A,但是你可以把它看作是一個隱藏的「終止」字符,即一切都大於。所以如果你想到A與第二個字符,可以說\n(它的字符爲空字符\ u0000,但很難顯示),那麼在比較A\nAlessio\n時,它會比較AA,無法以確定,然後繼續並比較l\n並且看到l>\n,因此它斷定整個字符串Alessio大於A

相反地,與操作者$lt,當其比較B\nBarbara\n到,將達到該比較a < \n(記住終止字符始終是更小),其評估對False因此Barbara不小於B