7

Mongo で大文字と小文字を区別しない検索を試みています。基本的に、大文字と小文字を区別しない文字列の一致が必要です。正規表現を使用しています。これが私のコードです

Query query = new Query( Criteria.where(propName).regex(value.toString(), "i"));

しかし、上記は私の文字列全体(スペースを含む文字列)と一致しません。部分文字列であっても値を返します。

例: コレクションに「Bill」と「Bill status」の 2 つの値があるとします。検索が「bill status」であっても、「bill」が返されます。検索している文字列の部分文字列があっても結果が返されます。為に

私は試したQuery query = new Query( Criteria.where(propName).is(value.toString()));

ただし、上記は大文字と小文字が区別されます。誰かがこれについて助けてくれますか。

4

2 に答える 2

3

正規表現 /^bill$/i は、大文字と小文字を区別しない方法で "Bill" に対してのみ一致します。

これを示す例を次に示します (mongo シェルで):

> db.foo.insert({name: "Bill"});
> db.foo.insert({name: "Bill status"});
> db.foo.insert({name: "another Bill"});
> db.foo.find()
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }
{ "_id" : ObjectId("5018e191a499db774b92bf26"), "name" : "Bill status" }
{ "_id" : ObjectId("5018e19ba499db774b92bf27"), "name" : "another Bill" }
> db.foo.find({name: /bill/i})
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }
{ "_id" : ObjectId("5018e191a499db774b92bf26"), "name" : "Bill status" }
{ "_id" : ObjectId("5018e19ba499db774b92bf27"), "name" : "another Bill" }
> db.foo.find({name: /^bill$/i})
{ "_id" : ObjectId("5018e182a499db774b92bf25"), "name" : "Bill" }

ただし、正規表現クエリはインデックスを使用しません。ただし、インデックスが左ルート (つまり、/^prefix/ の形式) であり、大文字と小文字を区別しない i フラグが使用されていない場合を除きます。インデックスを使用するクエリを使用すると、パフォーマンスが大幅に低下する可能性があります。そのため、ユース ケースによっては、次のような方法でアプリケーション ロジックを使用することをお勧めします。

  1. 項目をデータベースに挿入するときに大文字と小文字を強制します (たとえば、"bill" を "Bill" に変換します)。

  2. 既知のケースに対して検索を行います (例: "Bill" のみを検索します)。

于 2012-08-01T08:31:21.660 に答える