pymongoを使用した正規表現クエリの実行


129

mongodbサーバーに対してpymongoを使用して正規表現クエリを実行しようとしています。文書構造は以下の通りです

{
  "files": [
    "File 1",
    "File 2",
    "File 3",
    "File 4"
  ],
  "rootFolder": "/Location/Of/Files"
}

パターン* Fileに一致するすべてのファイルを取得します。こうやってやってみた

db.collectionName.find({'files':'/^File/'})

それでも私は何も返さない、mongodb docsによるとこれは可能であるはずだから私は何かを逃していますか?mongoコンソールでクエリを実行すると、正常に動作しますか?これは、APIがクエリをサポートしていないことを意味しますか?それとも、誤って使用しているだけですか?

回答:


191

正規表現オプション(大文字と小文字の違いなど)を含める場合は、次のようにしてください。

import re
regx = re.compile("^foo", re.IGNORECASE)
db.users.find_one({"files": regx})

8
また、最初にアンカーされた正規表現(つまり、で始まる^)は、dbでインデックスを使用でき、その場合ははるかに高速に実行されます。
drevicko 2013

1
^で始まる正規表現は、特定の場合にのみインデックスを使用できます。re.IGNORECASEを使用する場合、mongoはインデックスを使用してクエリを実行できないと思います。
nonagon 2015

この使用法はどこかに文書化されていますか?これは公式のpymongo APIドキュメントでは見つかりません。
Hieu

153

正規表現検索はpymongoでは少し異なる方法で行われますが、同じくらい簡単です。

正規表現は次のように行われます。

db.collectionname.find({'files':{'$regex':'^File'}})

これは、Fileで始まるアイテムを含むfilesプロパティを持つすべてのドキュメントに一致します。


9
実際、ここにあるのは、を使用する場合、JavaScript(およびおそらく他の言語)で行われる方法でもあります$regex。@Ericの答えは、Pythonの方法とは少し異なります。
drevicko 2013

違いは何ですか?彼らは両方ともPython pymongoを使用していますか?これはmongodbクエリの一部なので、実際には問題は発生しません。
デクスター

10
Ignorecaseは、mongodb JScriptの正規表現でも可能です。db.collectionname.find({'files':{'$ regex': '^ File'、 '$ options': 'i'}})
Ajay Gupta

5
この答えは私の目によく見えます。Mongoが再びコンパイルできるように文字列化しようとしているのに、なぜPython REをコンパイルする必要があるのでしょうか。Mongoの$regex演算子は$options引数を取ります。
Mark E. Haase

3
r'^File'代わりに'^File'を使用して、他の問題を回避してください
Aminah Nuraini、2015

9

二重コンパイルを回避するには、PyMongoに付属するbson regexラッパーを使用できます。

>>> regx = bson.regex.Regex('^foo')
>>> db.users.find_one({"files": regx})

Regexは文字列をコンパイルせずに格納するだけなので、find_oneは引数を「Regex」タイプとして検出し、適切なMongoクエリを作成できます。

この方法は、他のトップアンサーよりも少しPythonicだと思います。例:

>>> db.collectionname.find({'files':{'$regex':'^File'}})

いくつかの注意点があるため、regexクエリを使用する場合は、bson Regexのドキュメントを読む価値があります。


1
$ inを使用して配列を再度照合する必要がある場合、$ regexは機能しません。bson.regex.Regex トリックを行います!
odedfos 2018

4

のソリューションはre、インデックスをまったく使用しません。次のようなコマンドを使用する必要があります。

db.collectionname.find({'files':{'$regex':'^File'}})

(返信の下ではコメントできないので、ここで返信します)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.