var thename = 'Andrew';
db.collection.find({'name':thename});
大文字と小文字を区別しないクエリを実行するにはどうすればよいですか?「アンドリュー」でも結果を見つけたい。
var thename = 'Andrew';
db.collection.find({'name':thename});
大文字と小文字を区別しないクエリを実行するにはどうすればよいですか?「アンドリュー」でも結果を見つけたい。
回答:
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")
ように調整して、完全に一致させます。
".*"
。
あなたは、大文字と小文字を区別しない使用する必要があるだろう正規表現など、この1のために
db.collection.find( { "name" : { $regex : /Andrew/i } } );
thename
変数から正規表現パターンを使用するには、新しいRegExpオブジェクトを作成します。
var thename = "Andrew";
db.collection.find( { "name" : { $regex : new RegExp(thename, "i") } } );
更新:完全に一致させるには、正規表現を使用する必要があります"name": /^Andrew$/i
。YannickLに感謝します。
name
。
{ "name": /^Andrew$/i }
マングース(およびノード)では、これは機能しました:
User.find({ email: /^name@company.com$/i })
User.find({ email: new RegExp(
`^ $ {emailVariable} $`、 'i')})
MongoDBでは、これは機能しました:
db.users.find({ email: { $regex: /^name@company.com$/i }})
どちらの行も大文字と小文字は区別されません。DB内の電子メールは可能性がNaMe@CompanY.Com
あり、両方の行は引き続きDB内のオブジェクトを検索します。
同様に、使用/^NaMe@CompanY.Com$/i
することもできますname@company.com
が、DB内に電子メールが見つかります。
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});
これにより、「ニューヨーク」、「ニューヨーク」、「ニューヨーク」などの名前の都市が返されます。
大文字と小文字を区別しない文字列を見つけるには、これを使用します。
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$
Javascriptの完全なコード例、MongoDB上のMongooseORMを使用した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);
});
});
大文字と小文字を区別しないインデックスを使用できます。
次の例では、デフォルトの照合順序を使用せずにコレクションを作成し、大文字と小文字を区別しない照合順序を使用して名前フィールドにインデックスを追加します。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
大文字と小文字を区別しないリテラル文字列を検索するには:
db.collection.find({
name: {
$regex: new RegExp('^' + name.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')
}
});
db.collection.find({
name_lower: name.toLowerCase()
});
正規表現は、リテラル文字列照合よりも低速です。ただし、小文字のフィールドを追加すると、コードが複雑になります。疑わしい場合は、正規表現を使用してください。フィールドを置き換えることができる場合、つまり、そもそも大文字と小文字を気にしない場合にのみ、明示的に小文字のフィールドを使用することをお勧めします。
正規表現の前に名前をエスケープする必要があることに注意してください。ユーザー入力のワイルドカード.replace(/%/g, '.*')
が必要な場合は、「a%」に一致して「a」で始まるすべての名前を検索できるように、エスケープ後に追加することをお勧めします。
簡単な方法は、以下のように$ toLowerを使用することです。
db.users.aggregate([
{
$project: {
name: { $toLower: "$name" }
}
},
{
$match: {
name: the_name_to_search
}
}
])