web-dev-qa-db-ja.com

Pymongoで正規表現クエリを実行する

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

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

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

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

それでも、私は何も返されません、mongodbのドキュメントによると、これは可能だからです。 mongoコンソールでクエリを実行すると正常に動作しますが、これはapiがそれをサポートしていないことを意味しますか、それとも間違って使用していますか

119
RC1140

正規表現の検索は、pymongoでは少し異なりますが、同じくらい簡単です。

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

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

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

144
RC1140

大文字と小文字を区別しないなどの正規表現オプションを含める場合は、これを試してください。

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

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

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

正規表現は、文字列をコンパイルせずに保存するだけなので、find_oneは引数を「正規表現」型として検出し、適切なMongoクエリを形成できます。

この方法は、他のトップアンサーよりもわずかにPythonらしいと感じています、例えば:

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

いくつかの注意事項があるため、正規表現クエリを使用する予定がある場合は、bson Regexのドキュメントを読む価値があります。

3
Keeely

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

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

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

1
Jeff
import re

def get_pattern_query(pattern,starting_with=False,ending_with=False,ignore_case=False):
    start = '^' if starting_with else '.*'
    end = '$' if ending_with else '.*'
    pattern = start + re.escape(pattern) + end
    return re.compile(pattern, re.IGNORECASE) if ignore_case else re.compile(pattern)

パターンのエスケープコンパイル前にすべての文字を処理します。

0
daemon24