例:
> db.stuff.save({"foo":"bar"});
> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0
$caseSensitive
はデフォルトですでにfalseになっていますが、インデックス付きフィールドでのみ機能するため、質問には答えられません。OPは、大文字と小文字を区別しない文字列比較を探していました。
例:
> db.stuff.save({"foo":"bar"});
> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0
$caseSensitive
はデフォルトですでにfalseになっていますが、インデックス付きフィールドでのみ機能するため、質問には答えられません。OPは、大文字と小文字を区別しない文字列比較を探していました。
回答:
あなたは正規表現を使うことができます。
あなたの例では次のようになります:
db.stuff.find( { foo: /^bar$/i } );
ただし、値が見つかるたびに追加のコストが発生するのではなく、途中で値を小文字(または大文字)にすることもできます。明らかにこれは人の名前などでは機能しませんが、タグのようなユースケースかもしれません。
更新:
元の答えは廃止されました。Mongodbは、多くの機能を備えた高度な全文検索をサポートするようになりました。
元の回答:
正規表現の大文字と小文字を区別しない/ iで検索すると、mongodbはインデックスで検索できないため、大きなデータセットに対するクエリには時間がかかる可能性があることに注意してください。
データセットが小さい場合でも、それほど効率的ではありません。クエリが保証するよりもはるかに大きなCPUヒットを取得します。これは、スケールを達成しようとしている場合に問題になる可能性があります。
別の方法として、大文字のコピーを保存して検索することもできます。たとえば、大文字と小文字が混在するユーザー名を持つユーザーテーブルがありますが、IDはユーザー名の大文字のコピーです。これにより、大文字と小文字が区別される複製が不可能になり(「Foo」と「foo」の両方を使用することはできなくなります)、id = username.toUpperCase()で検索して、大文字と小文字を区別しないユーザー名の検索を取得できます。
メッセージ本文のようにフィールドが大きい場合、データの複製はおそらく適切なオプションではありません。その場合、Apache Luceneのような無関係なインデクサーを使用するのが最良のオプションだと思います。
username: 'bill'
マッチングBILL
かBill
、ないにもマッチがなり、フルテキスト検索クエリ、言葉茎のbill
ように、Bills
、billed
など
変数から正規表現を作成する必要がある場合、これははるかに優れた方法です:https : //stackoverflow.com/a/10728069/309514
その後、次のようなことができます:
var string = "SomeStringToFind";
var regex = new RegExp(["^", string, "$"].join(""), "i");
// Creates a regex of: /^SomeStringToFind$/i
db.stuff.find( { foo: regex } );
これには、よりプログラマティックであるという利点があります。または、それを頻繁に再利用している場合は、事前にコンパイルすることでパフォーマンスを向上させることができます。
new RegExp("^" + req.params.term.toLowerCase(), "i")
また、正常に機能します
前の例は次のとおりです。
db.stuff.find( { foo: /bar/i } );
バーを含むすべてのエントリが発生しますをクエリ(bar1、barxyz、openbar)と一致するようになります。認証関数でのユーザー名検索では非常に危険です...
次のように適切な正規表現構文を使用して、検索用語のみに一致させる必要がある場合があります。
db.stuff.find( { foo: /^bar$/i } );
正規表現の構文ヘルプについては、http://www.regular-expressions.info/を参照してください
MongoDB 3.4以降、大文字と小文字を区別しない高速検索を実行するための推奨される方法は、大文字と小文字を区別しないインデックスを使用することです。
私は創設者の一人に個人的にメールを送ってこれを機能させてください、そして彼はそれを実現させました!これは2009年以降のJIRAの問題であり、多くの人がこの機能をリクエストしています。仕組みは次のとおりです。
大文字と小文字を区別しないインデックスは、1または2の強さの照合順序を指定することによって作成されます。次のように、大文字と小文字を区別しないインデックスを作成できます。
db.cities.createIndex(
{ city: 1 },
{
collation: {
locale: 'en',
strength: 2
}
}
);
コレクションを作成するときに、コレクションごとにデフォルトの照合を指定することもできます。
db.createCollection('cities', { collation: { locale: 'en', strength: 2 } } );
どちらの場合でも、大文字と小文字を区別しないインデックスfind
を使用するには、インデックスまたはコレクションの作成時に使用された操作と同じ照合を指定する必要があります。
db.cities.find(
{ city: 'new york' }
).collation(
{ locale: 'en', strength: 2 }
);
これは、「ニューヨーク」、「ニューヨーク」、「ニューヨーク」などを返します。
username: 'bill'
マッチングBILL
やBill
もマッチします、ないフルテキスト検索クエリ、茎の単語のbill
ような、Bills
、billed
など正規表現の使用を提案する答えは遅くなります。これは、インデックスがあっても、ドキュメントには次のように記載されているためです。
「大文字と小文字を区別しない正規表現クエリでは、通常、インデックスを効果的に使用できません。$ regexの実装は照合に対応しておらず、大文字と小文字を区別しないインデックスを利用できません。」
$regex
答えはまた、ユーザー入力インジェクションのリスクを冒します。
db.zipcodes.find({city : "NEW YORK"}); // Case-sensitive
db.zipcodes.find({city : /NEW york/i}); // Note the 'i' flag for case-insensitivity
TL; DR
RegExpを使用しない
自然に進み、mongodbの組み込みインデックスを使用して検索
db.articles.insert(
[
{ _id: 1, subject: "coffee", author: "xyz", views: 50 },
{ _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
{ _id: 3, subject: "Baking a cake", author: "abc", views: 90 },
{ _id: 4, subject: "baking", author: "xyz", views: 100 },
{ _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
{ _id: 6, subject: "Сырники", author: "jkl", views: 80 },
{ _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
{ _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
]
)
検索したいTEXTフィールドにインデックスを作成する必要がありますが、クエリのインデックスを作成しないと非常に遅くなります
db.articles.createIndex( { subject: "text" } )
db.articles.find( { $text: { $search: "coffee",$caseSensitive :true } } ) //FOR SENSITIVITY
db.articles.find( { $text: { $search: "coffee",$caseSensitive :false } } ) //FOR INSENSITIVITY
username: 'bill'
マッチングBILL
かBill
、ないにもマッチがなり、フルテキスト検索クエリ、言葉茎のbill
ように、Bills
、billed
など
db.company_profile.find({ "companyName" : { "$regex" : "Nilesh" , "$options" : "i"}});
$existing = Users::masterFind('all', ['conditions' => ['traits.0.email' => ['$regex' => "^$value$", '$options' => 'i']]]);
Mongo(現在のバージョン2.0.0)では、インデックス付きフィールドに対する大文字と小文字を区別しない検索は許可されていません。ドキュメントを参照してください。インデックスのないフィールドの場合、他の回答にリストされている正規表現で問題ありません。
正規表現ベースのクエリを使用する際の重要な注意点の1つ-ログインシステムでこれを行う場合は、検索するすべての文字をエスケープし、^および$演算子を忘れないでください。Lodashはこれのための素晴らしい関数を持っています。
db.stuff.find({$regex: new RegExp(_.escapeRegExp(bar), $options: 'i'})
どうして?.*
ユーザーがユーザー名として入力したとします。これはすべてのユーザー名と一致し、ユーザーのパスワードを推測するだけでログインできるようになります。
最良の方法は、選択した言語にあります。オブジェクトのモデルラッパーを作成するときに、save()メソッドで、検索対象となるインデックス付きのフィールドセットを反復処理します。それらのフィールドのセットには、対応する小文字があり、それらは検索に使用されます。
オブジェクトが再度保存されるたびに、小文字のプロパティがチェックされ、メインプロパティへの変更で更新されます。これにより効率的に検索できるようになりますが、lcフィールドを毎回更新するために必要な余分な作業は非表示になります。
小文字のフィールドは、key:valueオブジェクトストアか、接頭辞lc_が付いたフィールド名だけです。私は2番目のものを使用してクエリを簡略化します(深いオブジェクトのクエリは時々混乱する可能性があります)。
注:lc_フィールドのインデックスを作成する必要がありますが、それらのベースとなっているメインフィールドではありません。
「テーブル」の「列」を検索し、大文字小文字を区別しない検索が必要だとします。最良かつ効率的な方法は以下のとおりです。
//create empty JSON Object
mycolumn = {};
//check if column has valid value
if(column) {
mycolumn.column = {$regex: new RegExp(column), $options: "i"};
}
Table.find(mycolumn);
上記のコードは、検索値をRegExとして追加し、オプションとして "i"を設定した鈍感な基準で検索します。
ではごきげんよう。
Mongooseを使用すると、これは私のために働きました:
var find = function(username, next){
User.find({'username': {$regex: new RegExp('^' + username, 'i')}}, function(err, res){
if(err) throw err;
next(null, res);
});
}
.toLowerCase()
の大文字と小文字を区別しないフラグを指定している場合、冗長ではありませんi
か?
集約フレームワークはmongodb 2.2で導入されました。文字列演算子 "$ strcasecmp"を使用して、文字列間で大文字と小文字を区別しない比較を行うことができます。正規表現を使用するよりも推奨され、簡単です。
これは、集約コマンドオペレーターに関する公式ドキュメントです:https : //docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp。
大文字と小文字を区別しないインデックスを使用できます。
次の例では、デフォルトの照合順序のないコレクションを作成し、大文字と小文字を区別しない照合順序で名前フィールドにインデックスを追加します。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.users.createIndex( { name: 1 }, {collation: { locale: 'tr', strength: 2 } } )
変数を検索してエスケープする場合:
const escapeStringRegexp = require('escape-string-regexp')
const name = 'foo'
db.stuff.find({name: new RegExp('^' + escapeStringRegexp(name) + '$', 'i')})
変数をエスケープすると、 '。*'またはその他の正規表現による攻撃からクエリが保護されます。
RegExpを使用します。他のオプションが機能しない場合は、RegExpが適切なオプションです。文字列の大文字と小文字を区別しません。
var username = new RegExp("^" + "John" + "$", "i");;
クエリでユーザー名を使用し、それを実行します。
私もそれがあなたのために働くことを望みます。ではごきげんよう。
フィルターを使用すると、C#で動作します。
string s = "searchTerm";
var filter = Builders<Model>.Filter.Where(p => p.Title.ToLower().Contains(s.ToLower()));
var listSorted = collection.Find(filter).ToList();
var list = collection.Find(filter).ToList();
戻りが発生した後にメソッドが呼び出されると思うので、インデックスを使用することもできますが、まだテストしていません。
これはまたの問題を回避します
var filter = Builders<Model>.Filter.Eq(p => p.Title.ToLower(), s.ToLower());
そのmongodbは、p.Title.ToLower()はプロパティであると見なし、適切にマップされません。
Golangを使用していて、mongodbとmgo godoc globalsignライブラリを使用して、大文字と小文字を区別する全文検索をしたい人。
collation := &mgo.Collation{
Locale: "en",
Strength: 2,
}
err := collection.Find(query).Collation(collation)
mongo docsでわかるように、バージョン3.2以降、$text
インデックスはデフォルトで大文字と小文字を区別しません:https : //docs.mongodb.com/manual/core/index-text/#text-index-case-insensitiveivity
username: 'bill'
マッチングBILL
かBill
、ないにもマッチがなり、フルテキスト検索クエリ、言葉茎のbill
ように、Bills
、billed
など
これらは文字列検索用にテストされています
{'_id': /.*CM.*/} ||find _id where _id contains ->CM
{'_id': /^CM/} ||find _id where _id starts ->CM
{'_id': /CM$/} ||find _id where _id ends ->CM
{'_id': /.*UcM075237.*/i} ||find _id where _id contains ->UcM075237, ignore upper/lower case
{'_id': /^UcM075237/i} ||find _id where _id starts ->UcM075237, ignore upper/lower case
{'_id': /UcM075237$/i} ||find _id where _id ends ->UcM075237, ignore upper/lower case
私は同様の問題に直面していましたが、これは私にとってうまくいったものです:
const flavorExists = await Flavors.findOne({
'flavor.name': { $regex: flavorName, $options: 'i' },
});
$caseSensitive: false
。参照: docs.mongodb.org/manual/reference/operator/query/text/...