114


37

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がそれをサポートしていないことを意味しますか、それとも間違って使用していますか

5 Answer


166


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

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


135


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

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

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

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


2


二重コンパイルを回避するには、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のドキュメントを読む価値があります。


1


「re」の解決策は、インデックスをまったく使用しません。 次のようなコマンドを使用する必要があります。

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

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


0


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)

*パターンをエスケープ*すると、コンパイル前にすべての文字が処理されます。