2012-04-27 11 views
6

Mongoデータベースに、リスト内の接頭辞で始まる特定のプロパティを持つ要素を照会する必要があります。今、私はこのようなコードの一部がありますリストに指定された接頭辞で始まるプロパティを持つオブジェクトのMongoEngine照会リスト

query = mymodel(terms__term__in=query_terms) 

を、これは明示的にリスト「QUERY_TERMS」で発生したStringField「という用語を」持っているリスト「用語」の項目を持つオブジェクトに一致します。私が達成したいのは、リスト "query_terms"に現れる接頭辞で始まるStringField "term"を持つリスト "terms"に項目を持つオブジェクトを持つことです。 1つのクエリで、 "term"のすべての可能な接頭辞をデータベースに格納せずにそれを実行することは可能ですか? EDIT: 下のソリューションはうまくいきましたが、今ではリストのすべての接頭辞で始まる用語でオブジェクトを見つけなければなりません。私は

query = reduce(lambda q1, q2: q1.__and__(q2), 
      map(lambda prefix: Q(terms__term__startswith=prefix))) 

query = reduce(lambda q1, q2: q1.__or__(q2), 
      map(lambda prefix: Q(terms__term__startswith=prefix))) 

を変更したが、これは動作しません。私は、次のエラーを取得します。

アイデア?

prefixes = [....] 
regex = '^(%s)' % '|'.join(map(re.escape, prefixes)) 
docs = your_collection.find({'term': {'$regex': regex}}) 

UPD:

答えて

9

あなたはそれが価値だために、あなたがそうのようperfixで始まる値をフィルタリングすることができる用語を問い合わせる場合:あなたは複数のプレフィックスをフィルタリングする必要がある場合は

MyModel.objects.filter(terms__term__startswith='foo') 

あなたがのためにQオブジェクトを作成する必要がありますその:あなたが動的にクエリを作成する必要がある場合

MyModel.objects.filter(Q(terms__term__startswith='foo') | Q(terms__term__startswith='bar')) 

prefixes = ['foo', 'bar', 'baz'] 
query = reduce(lambda q1, q2: q1.__or__(q2), 
       map(lambda prefix: Q(terms__term__startswith=prefix), prefixes)) 
MyModel.objects.filter(query) 
+0

おかげで、それは私が思ったよりも簡単だし、 よく働く! –

+0

ありがとう@分あなたの編集を追加しました。 –

2

あなたは^(prefix1 | prefix2 etc)のような正規表現を使用することができ、この質問はmongoengineについてです気づきませんでした。上記のpymongoは純粋なものですが、MEがこれを許しているかどうかわかりません。

関連する問題