如何在Mongodb上进行不区分大小写的查询?

时间:2011-08-18 02:22:41

标签: regex mongodb database

var thename = 'Andrew';
db.collection.find({'name':thename});

如何查询不区分大小写?我想找到结果,即使“andrew”;

12 个答案:

答案 0 :(得分:95)

Chris Fulstow的解决方案将起作用(+1),但是,它可能效率不高,特别是如果你的收藏非常大。非根节点正则表达式(不以^开头,将正则表达式锚定到字符串的开头),以及使用i标志表示不区分大小写的表达式将不使用索引,即使它们存在。

您可能考虑的另一种选择是对数据进行非规范化,以存储name字段的小写版本,例如name_lower。然后,您可以有效地查询(特别是如果它被索引),以用于不区分大小写的完全匹配,例如:

db.collection.find({"name_lower": thename.toLowerCase()})

或者使用前缀匹配(带根的正则表达式):

db.collection.find( {"name_lower":
    { $regex: new RegExp("^" + thename.toLowerCase(), "i") } }
);

这两个查询都将使用name_lower上的索引。

答案 1 :(得分:63)

您需要对此案例使用不区分大小写的regular expression,例如

db.collection.find( { "name" : { $regex : /Andrew/i } } );

要使用thename变量中的正则表达式模式,请构造一个新的RegExp对象:

var thename = "Andrew";
db.collection.find( { "name" : { $regex : new RegExp(thename, "i") } } );

更新:要完全匹配,您应该使用正则表达式"name": /^Andrew$/i。感谢Yannick L。

答案 2 :(得分:23)

我已经解决了这个问题。

 var thename = 'Andrew';
 db.collection.find({'name': {'$regex': thename,$options:'i'}});

如果您想查询'不区分大小写的完全匹配'那么你可以这样。

var thename =  '^Andrew$';
db.collection.find({'name': {'$regex': thename,$options:'i'}});

答案 3 :(得分:5)

我刚刚在几个小时前解决了这个问题。

var thename = 'Andrew'
db.collection.find({ $text: { $search: thename } });
  • 在以这种方式进行查询时,区分大小写和变音符敏感度默认设置为false。

您甚至可以通过以下方式选择安德鲁用户对象所需的字段来进行扩展:

db.collection.find({ $text: { $search: thename } }).select('age height weight');

参考:https://docs.mongodb.org/manual/reference/operator/query/text/#text

答案 4 :(得分:5)

MongoDB 3.4现在包含了制作真正不区分大小写的索引的能力,这将极大地提高大型数据集上不区分大小写的查找速度。它是通过指定强度为2的归类来完成的。

最简单的方法可能是在数据库上设置排序规则。然后所有查询都继承该排序规则并将使用它:

db.createCollection("cities", { collation: { locale: 'en_US', strength: 2 } } )
db.names.createIndex( { city: 1 } ) // inherits the default collation

你也可以这样做:

db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}});

并像这样使用它:

db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2});

这将返回名为" new york"," New York"," New york"等的城市

了解更多信息:https://jira.mongodb.org/browse/SERVER-90

答案 5 :(得分:4)

...在NodeJS上带有猫鼬查询:

const countryName = req.params.country;

{ 'country': new RegExp(`^${countryName}$`, 'i') };

const countryName = req.params.country;

{ 'country': { $regex: new RegExp(`^${countryName}$`), $options: 'i' } };

// ^australia$

const countryName = req.params.country;

{ 'country': { $regex: new RegExp(`^${countryName}$`, 'i') } };

// ^turkey$

MongoDB上带有Mongoose ORM的Javascript NodeJS完整代码示例

// get all customers that given country name
app.get('/customers/country/:countryName', (req, res) => {
    //res.send(`Got a GET request at /customer/country/${req.params.countryName}`);

    const countryName = req.params.countryName;

    // using Regular Expression (case intensitive and equal): ^australia$

    // const query = { 'country': new RegExp(`^${countryName}$`, 'i') };
    // const query = { 'country': { $regex: new RegExp(`^${countryName}$`, 'i') } };
    const query = { 'country': { $regex: new RegExp(`^${countryName}$`), $options: 'i' } };

    Customer.find(query).sort({ name: 'asc' })
        .then(customers => {
            res.json(customers);
        })
        .catch(error => {
            // error..
            res.send(error.message);
        });
});

答案 6 :(得分:3)

  1. 在猫鼬(和Node)中,它起作用了:

    • User.find({ email: /^name@company.com$/i })

    • User.find({ email: new RegExp(`^ $ {emailVariable} $`,'i')})

  2. 在MongoDB中,这有效:

    • db.users.find({ email: { $regex: /^name@company.com$/i }})

这两行都不区分大小写。数据库中的电子邮件可能为NaMe@CompanY.Com,并且两行仍将在数据库中找到对象。

同样,我们可以使用/^NaMe@CompanY.Com$/i,它仍然可以在数据库中找到电子邮件:name@company.com

答案 7 :(得分:2)

要查找不区分大小写的字符串,请使用

var thename = "Andrew";
db.collection.find({"name":/^thename$/i})

答案 8 :(得分:1)

以下查询将找到所需字符串 不敏感且全局出现的文档

db.collection.find({name:{
                             $regex: new RegExp(thename, "ig")
                         }
                    },function(err, doc) {
                                         //Your code here...
                  });

答案 9 :(得分:1)

您可以使用不区分大小写的索引

以下示例创建一个没有默认排序规则的集合,然后在名称字段上添加一个不区分大小写的排序规则的索引。 International Components for Unicode

/*
* strength: CollationStrength.Secondary
* Secondary level of comparison. Collation performs comparisons up to secondary * differences, such as diacritics. That is, collation performs comparisons of 
* base characters (primary differences) and diacritics (secondary differences). * Differences between base characters takes precedence over secondary 
* differences.
*/
db.users.createIndex( { name: 1 }, collation: { locale: 'tr', strength: 2 } } )

要使用索引,查询必须指定相同的排序规则。

db.users.insert( [ { name: "Oğuz" },
                            { name: "oğuz" },
                            { name: "OĞUZ" } ] )

// does not use index, finds one result
db.users.find( { name: "oğuz" } )

// uses the index, finds three results
db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 2 } )

// does not use the index, finds three results (different strength)
db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 1 } )

或者您可以使用默认排序规则创建集合:

db.createCollection("users", { collation: { locale: 'tr', strength: 2 } } )
db.users.createIndex( { name : 1 } ) // inherits the default collation

答案 10 :(得分:0)

这将完美运行
db.collection.find({ song_Name: { '$regex': searchParam, $options: 'i' } })

只需添加您的正则表达式 $options: 'i',其中 i 不区分大小写。

答案 11 :(得分:-1)

一种简单的方法是使用$ toLower,如下所示。

db.users.aggregate([
    {
        $project: {
            name: { $toLower: "$name" }
        }
    },
    {
        $match: {
            name: the_name_to_search
        }
    }
])