对mongodb不区分大小写的查询

时间:2011-03-31 11:58:22

标签: mongodb

有没有办法在不使用map / reduce的情况下在mongodb中查询不区分大小写的值?

4 个答案:

答案 0 :(得分:24)

假设您的文档包含tag字段,并且您希望在其上进行搜索

Tags
{
  tag,
  ...
 }

第一个选项是使用正则表达式(但它运行缓慢,如@RestRisiko所说):

db.tags.find( { "tag" : { "$regex" : "C#", "$options" : "-i" } })

第二个选项是创建另一个小写字段(在mongodb中最好的方式):

Tags
{
  tag,
  tagLower,
  ..
}

像往常一样使用find

db.tags.find( { "tagLower" : "c#"})

它会更快,因为上面的代码可以使用索引进行搜索。

答案 1 :(得分:8)

您必须规范化要查询的数据。使用正则表达式进行不区分大小写的搜索可能也有效,因此不会使用索引。所以你唯一的选择是规范化。如果需要保留原始状态,则需要对数据进行非规范化,并将规范化值存储在文档的专用列中。

答案 2 :(得分:2)

与Node.js一起使用时,最好在查询中构建一个RegEx对象。

Room.findOne({'name': new RegExp(roomName, 'i')}, {}, function(err, room) {
...

答案 3 :(得分:0)

使用如下匹配的正则表达式。 ' i'显示不区分大小写。

var collections = mongoDatabase.GetCollection("Abcd");

var queryA = Query.And(
         Query.Matches("strName", new BsonRegularExpression("MSID", "i")), 
         Query.Matches("strVal", new BsonRegularExpression("154800", "i")));

var queryB = Query.And(
       Query.Matches("strName", new BsonRegularExpression("Operation","i")),
       Query.Matches("strVal", new BsonRegularExpression("8221", "i")));

var getA = collections.Find(queryA);
var getB = collections.Find(queryB);