20

私は python の mongoengine を使用して MongoDB にクエリを実行しており、大部分は気に入っていますが、高度なクエリに問題があります。

これが私のモデルです

class ContentItem(Document):
    account = ReferenceField(Account)
    creator = ReferenceField(User)
    public = BooleanField(default=False) 
    last_used = DateTimeField(default=datetime.now)

ContentItem特定のアカウントに属し、ログインしているユーザーによって作成された、または公開されているすべての のクエリを作成したいと思います。ここに私が書いたクエリがあります

query = ContentItem.objects.filter( (Q(account=account) & Q(public=True)) |  (Q(account=account) & Q(creator=logged_in_user)) ).order_by('-last_used')

また:

query = ContentItem.objects.filter( Q(account=account) & ( Q(public=True) |  Q(creator=logged_in_user) ) ).order_by('-last_used')

publicしかし、これらは XOR のように見えますcreator。これは期待されていますか?

私は何かを見落としていますか?mongoengine の代わりに mongodb で直接これを行う必要がありますか?

私の現在の回避策は、2 つの異なるクエリを作成して結果を結合することです。 (django)ページ分割された結果の利点。

4

5 に答える 5

6

この場合、mongoengineのドキュメントは明らかに正しくありません。ビット演算子「&」と「|」を使用する代わりに、標準演算子「and」と「or」を使用する必要があります。

したがって、最初のクエリは次のようになります。

query = ContentItem.objects.filter( (Q(account=account) and Q(public=True)) or  (Q(account=account) and Q(creator=logged_in_user)) ).order_by('-last_used')
于 2011-11-21T21:34:41.957 に答える
6

クエリを実行する正しい方法は、ビットごとの操作|&、質問に書いた方法を使用することです。

query = ContentItem.objects.filter( (Q(account=account) & Q(public=True)) |  (Q(account=account) & Q(creator=logged_in_user)) ).order_by('-last_used')

: 標準の Python ブール演算子andを使用すると機能しorませ。これについては、MongoEngine のドキュメントで説明されています。

于 2015-11-17T13:10:06.823 に答える
2

https://github.com/MongoEngine/mongoengine/blob/master/tests/queryset/transform.py

134行目から:

def test_raw_query_and_Q_objects(self):
    query = Foo.objects(__raw__={'$nor': [{'name': 'bar'}]})._query
    self.assertEqual(query, {'$nor': [{'name': 'bar'}]})

    q1 = {'$or': [{'a': 1}, {'b': 1}]}
    query = Foo.objects(Q(__raw__=q1) & Q(c=1))._query
    self.assertEqual(query, {'$or': [{'a': 1}, {'b': 1}], 'c': 1})
于 2015-04-17T19:09:21.043 に答える