2015-06-17 55 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

我曾问过架构元素不区分大小写,而不是值。 –