【发布时间】:2011-03-31 11:58:22
【问题描述】:
有没有办法在不使用 map/reduce 的情况下在 mongo 上查询不区分大小写的值?
【问题讨论】:
标签: mongodb
有没有办法在不使用 map/reduce 的情况下在 mongo 上查询不区分大小写的值?
【问题讨论】:
标签: mongodb
假设您有一个包含 tag 字段的文档,并且您希望在其上进行搜索
Tags
{
tag,
...
}
第一个选项是使用正则表达式(但正如@RestRisiko 所说,它的工作速度很慢):
db.tags.find( { "tag" : { "$regex" : "C#", "$options" : "-i" } })
第二个选项是创建另一个小写字段(在 mongodb 中是最好的方法):
Tags
{
tag,
tagLower,
..
}
像往常一样使用find:
db.tags.find( { "tagLower" : "c#"})
它会更快,因为上面的代码可以使用索引进行搜索。
【讨论】:
您必须对要查询的数据进行规范化。使用正则表达式进行不区分大小写的搜索可能也有效,但它不会使用索引。所以你唯一的选择是规范化。如果您需要保留原始状态,则需要对数据进行非规范化并将规范化后的值存储在文档的专用列中。
【讨论】:
与 Node.js 一起使用时,最好在查询中构建一个 RegEx 对象。
Room.findOne({'name': new RegExp(roomName, 'i')}, {}, function(err, room) {
...
【讨论】:
使用正则表达式匹配如下。 '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);
【讨论】: