具有不区分大小写的架构元素的mongoDB查询

时间:2015-06-17 15:11:39

标签: mongodb nosql

在我的MongoDB集合中,我添加了如下记录

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

如果我搜索

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

我得到一条记录。但是,如果我尝试'#34; NAME"而不是" name"即。

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

它不会返回任何记录。

这意味着我必须知道schema元素是如何精确拼写的。有没有办法通过忽略schema元素的情况来编写查询。

我们可以使用不区分大小写的方法搜索元素值,如下所示

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

架构元素是否类似;

之类的东西
> db.teacher.find({/NAME/i:"kaushik"})

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这与javascript引擎和json规范有关。在js标识符区分大小写。这意味着您可以拥有一个包含两个名为" name"的字段的文档。和"姓名"或" NAME"。所以mongodb作为你的领域的两个不同的归档。

答案 2 :(得分:-2)

您可以使用像

这样的正则表达式

db.teacher.find({名称:/ ^ Kaushik将$ / I})