2015-06-17 53 views
2

在我的MongoDB集合,如下所示MongoDB的查詢與不區分大小寫的架構元素

db.teacher.insert({_id:1 ,"name":"Kaushik"}) 

如果我搜索

db.teacher.find({name:"Kaushik"}) 

我得到一個記錄我添加了一個紀錄。但是,如果我嘗試使用「NAME」而不是「名稱」,即

db.teacher.find({NAME:"Kaushik"}) 

它不會返回任何記錄。

這意味着我必須知道模式元素是如何精確拼寫的。有沒有辦法通過忽略模式元素的情況來編寫查詢。

我們可以通過如下

> db.teacher.find({name:/kAUSHIK/i}) 
{ "_id" : 1, "name" : "Kaushik" } 

不區分大小寫的元素值是否有類似的架構元素;像

> db.teacher.find({/NAME/i:"kaushik"}) 
+0

不是一個好辦法沒有。你可以在JavaScript中編寫所有的匹配,但它不能使用索引或其他優化的本地特性爲什麼你要這樣做呢?我知道MongoDB是無模式的,但是在文檔之間,元素名稱不應該變化,因爲通常會在文檔之間改變結構或類型是不明智的。 –

+0

如何簡單地使用所有小寫字母或camelcase鍵?問題解決了。 –

+0

@ user3561036加入到集合中我自己犯了錯誤,我在一個文檔中使用「名稱」,而在其他文檔中使用「名稱」。這可能發生在其他元素「studenId」/「studentid」。我同意元素名稱應該一致。但由於某種原因,如果他們不是;那麼有辦法處理它;是我很好奇的。 –

回答

3

我們可以使用不區分大小寫[搜索元素值... ]

有[東西]爲架構元素[相似?]


我們可以假設JavaScript和JSON區分大小寫,MongoDB查詢也是如此。

話雖這麼說,內部MongoDB使用BSON,並the specs隻字不提鍵區分大小寫。所述BNF語法僅說要素名是一個NUL終止modified UTF-8字符串:

e_name  ::=  cstring   Key name 
cstring  ::=  (byte*) "\x00"  Zero or more modified UTF-8 encoded 
             characters followed by '\x00'. The 
             (byte*) MUST NOT contain '\x00', hence 
             it is not full UTF-8. 

但是,從源代碼(herehere例如),看來MongoDB的BSON的實現使用strcmp以對二進制比較元素名稱,確認沒有辦法達到你想要的。

這可能確實是一個超出區分大小寫的問題,因爲使用combining characters時,同一個字符可能有多個二進制表示 - 但MongoDB不執行Unicode normalization。例如:

> db.collection.insert({"é":1}) 
> db.collection.find({"é":1}).count() 
1 
> db.collection.find({"e\u0301":1}).count() 
0 
+0

感謝您的詳細解釋。你認爲將這個問題報告給mongoDB是值得的嗎?以防他們尚未將其標記爲「已知限制」。 –

0

這與JavaScript引擎和json規範有關。在js標識符中區分大小寫。這意味着您可以擁有名爲「名稱」和「名稱」或「名稱」的兩個字段的文檔。所以mongodb在你的領域中扮演着兩個不同的角色。

-2

你可以使用正則表達式像

db.teacher.find({名稱:/^$分析師Kaushik/I})

+0

我曾問過架構元素不區分大小寫,而不是值。 –