var thename = 'Andrew';
db.collection.find({'name':thename});
如何查询不区分大小写?我想找到结果,即使“安德鲁”;
Answers:
克里斯·富尔斯托(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
。
new RegExp('^'+ username + '$', "i")
完全匹配。
".*"
。
name
,而不仅仅是匹配。
{ "name": /^Andrew$/i }
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});
这将返回名为“纽约”,“纽约”,“纽约”等的城市。
有关更多信息:https : //jira.mongodb.org/browse/SERVER-90
与猫鼬(和节点),这工作:
User.find({ email: /^name@company.com$/i })
User.find({ email: new RegExp(
`^ $ {emailVariable} $`,'i')})
在MongoDB中,这有效:
db.users.find({ email: { $regex: /^name@company.com$/i }})
这两行都不区分大小写。数据库中的电子邮件可能是,NaMe@CompanY.Com
并且两行仍将在数据库中找到对象。
同样,我们可以使用/^NaMe@CompanY.Com$/i
并且它仍会name@company.com
在数据库中找到电子邮件:。
要查找不区分大小写的字符串,请使用此命令,
var thename = "Andrew";
db.collection.find({"name":/^thename$/i})
几个小时前我刚刚解决了这个问题。
var thename = 'Andrew'
db.collection.find({ $text: { $search: thename } });
您甚至可以通过以下方式从Andrew用户对象中选择所需的字段来扩展此功能:
db.collection.find({ $text: { $search: thename } }).select('age height weight');
参考:https : //docs.mongodb.org/manual/reference/operator/query/text/#text
...在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$
Java语言中的完整代码示例,MongoDB上带有Mongoose ORM的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);
});
});
查找不区分大小写的文字字符串:
db.collection.find({
name: {
$regex: new RegExp('^' + name.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')
}
});
db.collection.find({
name_lower: name.toLowerCase()
});
正则表达式比文字字符串匹配慢。但是,附加的小写字段会增加代码的复杂性。如有疑问,请使用正则表达式。我建议仅在可以替换您的字段的情况下才使用显式小写的字段,也就是说,您首先不关心大小写。
请注意,您需要在正则表达式前转义该名称。如果要使用用户输入的通配符,则最好.replace(/%/g, '.*')
在转义后附加,以便可以匹配“ a%”以查找所有以“ a”开头的名称。
您可以使用不区分大小写的索引:
下面的示例创建一个没有默认归类的集合,然后使用不区分大小写的归类在名称字段上添加索引。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