2012-04-20 28 views
35

オブジェクトのフィールドに部分文字列が含まれているデータベースで、すべてのオブジェクトを見つけるにはどうすればよいですか?Mongodbのフィールドに部分文字列を見つける方法

フィールドが文字列値で、コレクションの対象である場合:

私は、Aは、サブストリングが「ABCデフ」と言うが含まデシベル「データベース」内のすべてのオブジェクトを見つけたいです。

私が試した:

db.database.find({A: {$regex: '/^*(abc def)*$/''}}) 

しかし

UPDATEが動作しませんでした

(ユニコードで)実際の文字列:

Sujet Commentaire sur Star Wars Episode III - La Revanche des Sith 1 

をすべてを検索する必要がスターウォーズのエントリ

db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring 
+1

を行います"任意の文字列"を探したい場合は、任意の(単一の)文字に対しては '。*'が必要です。あなたが持っている ''(スターウォーズ)* $ 'は"スターウォーズスターウォーズスターウォーズ "とマッチしますが、"スターウォーズ "はマッチしません。 – drevicko

答えて

39

の代わりにこの:

db.database.find({A: {$regex: '/^*(abc def)*$/''}}) 

あなたはこれを行う必要があります。

db.database.find({A: /abc def/i }) 

^*を^と$をアンカーではなく反復可能である何かをしているとして、実際に有効な構文ではありません。おそらく^。*を意味しています。しかし、「次の文字までのすべて」と「(abc def)*」は、「0回以上」「abc def」を意味するので、^。*は必要ありませんが、文字列の最後にある必要があります。あなたの$のために。「i」は最後にそれ大文字小文字を区別しませんようにすることです。

+2

注意: '^'を使用すると正規表現クエリのスピードアップに役立ちます。インデックスはこの形式でのみ有効です(http://docs.mongodb.org/manual/reference/operator/regex/のページ下部を参照) –

+0

正しいもし私が間違っているなら、私は私にはなりますが、 '^ *'は意味をなさないでしょうか?それは '^。*'ではありませんか?私には '^ *'は "0以上の行頭"を読みますが、その中には常に1つだけあり、それは私のように見えます。行の先頭と残りの正規表現の間の文字を許可します... – drevicko

+0

@drevicko、そうです。それは私の答えのタイプミスでした。私はそれを明らかにした。 – Derick

16

単なる文字列「スターウォーズ」を使用して@derickが指摘するようならば$regexは、残り

db.test.find({A: {$regex: 'Star Wars'}}) 
関連する問題