6

リスト内の任意のプレフィックスで始まる特定のプロパティを持つ要素について、Mongo データベースにクエリを実行する必要があります。今、私は次のようなコードを持っています:

query = mymodel(terms__term__in=query_terms)

これは、リスト「query_terms」で明示的に出現する StringField「term」を持つリスト「terms」にアイテムを持つオブジェクトに一致します。私が達成したいのは、リスト「query_terms」で発生するプレフィックスで始まるStringField「term」を持つリスト「terms」にアイテムを持つオブジェクトを持つことです。「用語」のすべての可能なプレフィックスをデータベースに保存せずに、1 つのクエリでそれを行うことは可能ですか? 編集: 以下のソリューションはうまく機能しますが、リストのすべてのプレフィックスで始まる用語を含むオブジェクトを見つける必要があります。私が変更され

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

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

しかし、これは機能しません。次のエラーが発生します。

InvalidQueryError: Duplicate query conditions: terms__term__startswith

何か案は?

4

2 に答える 2

9

用語の値をクエリする場合、次のように接頭辞で始まる値をフィルタリングできます。

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)
于 2012-04-27T10:51:44.200 に答える
2

次のような正規表現を使用できます^(prefix1 | prefix2 etc)

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

upd: この質問が mongoengine に関するものであることに気付きませんでした。上記は純粋な pymongo 用です。ME がこれを許可するかどうかはわかりません。

于 2012-04-27T10:30:11.823 に答える