8

PyMongoで$regexと$inを組み合わせるにはどうすればよいですか?

/*.heavy.*/または のいずれかを検索したい/*.metal.*/

私は成功せずにpythonで試しました:

db.col.find({'music_description' : { '$in' : [ {'$regex':'/*.heavy.*/'} ]} })

Mongo シェルで同等のものは次のとおりです。

db.inventory.find( { music_description: { $in: [ /heavy/, /metal/ ] } } )
4

2 に答える 2

6

なぜわざわざ $in を使うのでしょうか? リスト内の各値のフィールドを評価することで処理を浪費しています。各値は正規表現であるため、パフォーマンスに関する独自の考慮事項があります。クエリ文字列の長さによっては、それらを 1 つにまとめることをお勧めします。 regex と $in クエリを一緒に回避する

import re
db.col.find({'music_description': re.compile('heavy|metal')})

同様にモンゴシェルで

db.inventory.find({music_description: /heavy|metal/})

[user2998367] の回答については、一致のみを目的として貪欲なワイルドカードを使用して正規表現をコンパイルする効率を無駄にしています。Python での re.search と re.match の違いにより、re.search にワイルドカードを使用する必要があります。ただし、re.match は MongoDB と同様に「文字列のどこでも」として動作します。これが本当に必要になるのは、とにかくクエリを実行した後に後で行う必要がある抽出を意図している場合、またはコンパイル済みのファイルを再利用している場合のみです。特に re.match よりも re.search が必要な他の場所での正規表現

于 2015-04-14T06:35:09.883 に答える