MongoDB正則表現と応用
正規表現は、すべての言語で文字列のモードまたはテキストを検索するためによく使われます。MongoDBは正規表現機能の文字列モードに正規表現で$regex演算子を使用することも提供しています。MongoDBはPCRE(Perl互換正規表現)を正規表現言語として使用します。
テキスト検索とは違って、任意の設定やコマンドを必要とせずに正規表現を直接使うことができます。
テキストを含むラベルのセットを考慮して、ドキュメント構造は以下の通りです。
以下の正規表現の検索は、文字列yibai.comを含むすべての投稿を検索します。
>db.posts.find({post_}text:/yibai.com/}
正規表現を使うと、大文字と小文字は区別されません。
検索に大文字と小文字を区別しないようにするために、私たちは$optionsを使って値パラメータiを持っています。下記のコマンドは文字列を検索します。サイズに関係なく、文字列を検索します。
配列フィールドの正規表現概念も使用できます。この時、ラベルの機能を実現することが重要です。したがって、タグが付いているものを検索したいなら、フレーズtutorialですべてのスレッドを開始してもいいです。
ドキュメントフィールドがインデックスされている場合、クエリーはインデックス値を用いたマッチング正規表現を使用します。これは検索を非常に速くし、正規表現は集合全体をスキャンすることに対している。
正規表現がプレフィックス表現である場合、すべてのマッチは文字列で開始されます。例えば、正規表現^tutであれば、クエリはそれらの開始列のみを検索します。
monogodb正則表現の応用
mongodbでは正規表現が完全にサポートされています。一般的なクエリではオペレータ$regexが使用できます。
正則については、オプションがありますが、mongodbと他の言語の標準は少し違っています。自分の基準があります。
$optionsのオプション値
i大文字と小文字を無視する
m複数行の検索で、内容に改行記号が存在しない場合(例えば)、または構造上ない場合、このオプションは効果がありません。
x空白文字は、変換されたまたは文字クラスの他には完全に無視され、変換されていない文字クラス以外の33751;と次の改行記号の間のすべての文字は、両方を含めても無視されます。
s円記号(.)は、改行を含むすべての文字にマッチします。
仮に私たちがデータベースを持っているとしたら、モンゴデモという名前があります。
use mono
データベースにlnmopyという集合があります。
db.lnmopy.find()
次のようなデータがあります
{u}id":ObjectId("502 dd 63d 16 a 25b 1 ff60000"),"name":"wwww.lnmopy.com","site":"website","(:"l,n,m,o,p,y")
{u}id":ObjectId("502 d d 63d 16 a 25b 1 ff60000"),"name":"demo.lnmopy.com","site":"unknown",","(":"d,e,m,o")"
{u}id":ObjectId("502 dd 63d 16 a 25 b 1 ff60000"),"name":"welcome.lnmopy.c o m",","site":"website",",","(w,e,l,c,o,m,e")"
mongodbの正規表現はiとmのjavascript原生表記のみをサポートします。xとsオプションを使うなら、「$regex」を使って、「$options」でオプションを指定しなければなりません。
正規表現の更新操作を使う:
db.lnmopy.udate(''name'/*.lnmopy.com/i),{set:''site':''www.lnmopy.com');
現在のデータベースの「lnmopy」という集合の「name」フィールドが「/*.lnmopy.com/i」の正則に該当する項目を検索して、「site」フィールドだけを「wn.lnmopy.com」に更新します。この更新文はデータのみを更新します。すべてを置き換えるには、パラメータを追加できます。
db.lnmopy.udate(''name'/*.lnmopy.com/i),{set:''site'''''.lnmopy.com'},false,true);
パラメータには順番がありますが、falseはuplsertで、なければ新しいものを挿入します。trueとはmultiの複数の記録更新であり、すべての合致した結果である。または直接指定します。
db.lnmopy.udate(''name'/*.lnmopy.com/i),{set:''site':''www.lnmopy.com'}、{multi:true}
これですべての「site」フィールドを「www.lnmopy.com」に更新します。
私が設計したフィールドの「タグ」には欠陥があります。もともとは単語ですが、今は字母ごとに「分離」されています。実際の仕事にも同様の問題があります。大量のデータ変換や他のプログラムの操作が不適切だったり、業務上の需要変更などの理由で、いくつかのフィールドを正規の一括処理する必要があります。
正規表現はクエリー結果の','はい'を置換します。
db.lnmopy.find().forEach(u){u.tag.replace(/\,');db.lnmopy.save(u););
最後に実行
db.lnmopy.find()
次のデータを表示します。
{u}id":ObjectId("502 dd 63d 16 a 25b 1 f 60000"),"name":"wwww.lnmopy.com","site":"wwww.lnmopy.com","
{u}id":ObjectId("502 dd 63d 16 a 25 b 1 ff60000"),"name":"demo.lnmopy.com","site":"wwww.lnmopy.com","
{u}id":ObjectId("502 dd 63d 16 a 25b 1 ff60000"),"name":"welcome.lnmopy.com","site":"wwww.lnmopy.com","
後記:javascriptはmongodbの特色であり、利点でもあります。多くの複雑な検索と処理はjavascriptで実現できます。クラス比で言えば、javascriptはoracleの格納過程に相当し、10 gen(mongodbの開発チーム)の間にoracleから出てくるという点で、全くおかしくないです。もっと複雑なjavascriptの使い方については、後で書きます。
テキスト検索とは違って、任意の設定やコマンドを必要とせずに正規表現を直接使うことができます。
テキストを含むラベルのセットを考慮して、ドキュメント構造は以下の通りです。
{
"post_text": "enjoy the mongodb articles on yiibai",
"tags": [
"mongodb",
"yiibai"
]
}
正規表現を使う以下の正規表現の検索は、文字列yibai.comを含むすべての投稿を検索します。
>db.posts.find({post_text:{$regex:"yiibai.com"}})
同じ問い合わせでも、次のように書くことができます。>db.posts.find({post_}text:/yibai.com/}
正規表現を使うと、大文字と小文字は区別されません。
検索に大文字と小文字を区別しないようにするために、私たちは$optionsを使って値パラメータiを持っています。下記のコマンドは文字列を検索します。サイズに関係なく、文字列を検索します。
>db.posts.find({post_text:{$regex:"yiibai",$options:"$i"}})
このクエリを再調整した結果、以下のように、大きさに単語yibai文書が含まれています。
{
"_id" : ObjectId("53493d37d852429c10000004"),
"post_text" : "hey! this is my post on Yiibai",
"tags" : [ "yiibai" ]
}
正規表現を使う配列要素:配列フィールドの正規表現概念も使用できます。この時、ラベルの機能を実現することが重要です。したがって、タグが付いているものを検索したいなら、フレーズtutorialですべてのスレッドを開始してもいいです。
>db.posts.find({tags:{$regex:"tutorial"}})
正規表現のクエリを最適化:ドキュメントフィールドがインデックスされている場合、クエリーはインデックス値を用いたマッチング正規表現を使用します。これは検索を非常に速くし、正規表現は集合全体をスキャンすることに対している。
正規表現がプレフィックス表現である場合、すべてのマッチは文字列で開始されます。例えば、正規表現^tutであれば、クエリはそれらの開始列のみを検索します。
monogodb正則表現の応用
mongodbでは正規表現が完全にサポートされています。一般的なクエリではオペレータ$regexが使用できます。
db.lnmopy.find( { 'name': /*.lnmopy.com/i } )
db.lnmopy.find( { 'name': { $regex: '*.lnmopy.com', $options: 'i' } } )
以上の2つの完全な等価性は、ドメイン(field)すなわち上記の例の「name」キーに対して直接的に対すことができ、正規表現を使用するか、またはオペレータを使用するか、オプション項目はiであり、つまり、大文字と小文字を無視することができます。正則については、オプションがありますが、mongodbと他の言語の標準は少し違っています。自分の基準があります。
$optionsのオプション値
i大文字と小文字を無視する
m複数行の検索で、内容に改行記号が存在しない場合(例えば)、または構造上ない場合、このオプションは効果がありません。
x空白文字は、変換されたまたは文字クラスの他には完全に無視され、変換されていない文字クラス以外の33751;と次の改行記号の間のすべての文字は、両方を含めても無視されます。
s円記号(.)は、改行を含むすべての文字にマッチします。
仮に私たちがデータベースを持っているとしたら、モンゴデモという名前があります。
use mono
データベースにlnmopyという集合があります。
db.lnmopy.find()
次のようなデータがあります
{u}id":ObjectId("502 dd 63d 16 a 25b 1 ff60000"),"name":"wwww.lnmopy.com","site":"website","(:"l,n,m,o,p,y")
{u}id":ObjectId("502 d d 63d 16 a 25b 1 ff60000"),"name":"demo.lnmopy.com","site":"unknown",","(":"d,e,m,o")"
{u}id":ObjectId("502 dd 63d 16 a 25 b 1 ff60000"),"name":"welcome.lnmopy.c o m",","site":"website",",","(w,e,l,c,o,m,e")"
mongodbの正規表現はiとmのjavascript原生表記のみをサポートします。xとsオプションを使うなら、「$regex」を使って、「$options」でオプションを指定しなければなりません。
正規表現の更新操作を使う:
db.lnmopy.udate(''name'/*.lnmopy.com/i),{set:''site':''www.lnmopy.com');
現在のデータベースの「lnmopy」という集合の「name」フィールドが「/*.lnmopy.com/i」の正則に該当する項目を検索して、「site」フィールドだけを「wn.lnmopy.com」に更新します。この更新文はデータのみを更新します。すべてを置き換えるには、パラメータを追加できます。
db.lnmopy.udate(''name'/*.lnmopy.com/i),{set:''site'''''.lnmopy.com'},false,true);
パラメータには順番がありますが、falseはuplsertで、なければ新しいものを挿入します。trueとはmultiの複数の記録更新であり、すべての合致した結果である。または直接指定します。
db.lnmopy.udate(''name'/*.lnmopy.com/i),{set:''site':''www.lnmopy.com'}、{multi:true}
これですべての「site」フィールドを「www.lnmopy.com」に更新します。
私が設計したフィールドの「タグ」には欠陥があります。もともとは単語ですが、今は字母ごとに「分離」されています。実際の仕事にも同様の問題があります。大量のデータ変換や他のプログラムの操作が不適切だったり、業務上の需要変更などの理由で、いくつかのフィールドを正規の一括処理する必要があります。
正規表現はクエリー結果の','はい'を置換します。
db.lnmopy.find().forEach(u){u.tag.replace(/\,');db.lnmopy.save(u););
最後に実行
db.lnmopy.find()
次のデータを表示します。
{u}id":ObjectId("502 dd 63d 16 a 25b 1 f 60000"),"name":"wwww.lnmopy.com","site":"wwww.lnmopy.com","
{u}id":ObjectId("502 dd 63d 16 a 25 b 1 ff60000"),"name":"demo.lnmopy.com","site":"wwww.lnmopy.com","
{u}id":ObjectId("502 dd 63d 16 a 25b 1 ff60000"),"name":"welcome.lnmopy.com","site":"wwww.lnmopy.com","
後記:javascriptはmongodbの特色であり、利点でもあります。多くの複雑な検索と処理はjavascriptで実現できます。クラス比で言えば、javascriptはoracleの格納過程に相当し、10 gen(mongodbの開発チーム)の間にoracleから出てくるという点で、全くおかしくないです。もっと複雑なjavascriptの使い方については、後で書きます。