4

私は次のようなリストのリストを持っています:

li = [[('A', 'one'), ('A', 'two')], [('B', 'three'), ('B', 'four')]]

そして、mongoデータベースにクエリを実行して、リストフィールドにの各サブリストに少なくとも1つのアイテムが含まれているすべてのオブジェクトを取得する必要がありますli。例:[('A'、'one')OR('A'、'two')] AND [('B'、'three')OR('B'、'four')]のいずれかを持つアイテム..。

私はmongoengineを使用していますが、これを実行するために他の何かを使用できる場合は、変更できる可能性があります。したがって、現在、重複するエントリを取得しないように、このような多くのクエリを実行しています。

final = set()
for sublist in li:
    query = Obj.objects(list_field__in=sublist)
    final &= set(query)

問題は、大きなクエリ結果を処理するときにこれが非常に遅いことです(セットの作成には非常に長い時間がかかると思います)。これをスピードアップする方法はありますか?具体的には、クエリ結果からのセット/リストの作成を回避する方法はありますか?

私は本当にどういうわけかこのようなものを書くことができるようになりたいです:

query = Obj.objects(list_field__in=li[0] AND list_field__in=li[1] AND ...)

編集:mongoengineは許可しないため、以下の回答はそれ以上のテストでは機能しませんQ(field=x) & Q(field=y)

Edit2:これが私がやりたい同等のmongoDBクエリです:

db.obj.find({ "$and": [
    {"list_field": {"$in":
        [["A", "one"], ["A", "two"]]
    }},
    {"list_field": {"$in":
        [["B", "three"], ["B", "four"]]
    }}
]})

これをmongoengineで実行できますか?でクエリを実行できませんQ(list_field__in=[('A', 'one'), ('A', 'two')]) | Q(list_field__in=[('B', 'three'), ('B', 'four')])

4

1 に答える 1

5

Qクラスで試すことができると思います:

  filter = reduce(Q.__and__, map(lambda x: Q(list_field__in=x), li))
  Obj.objects(filter)
于 2013-01-28T15:01:38.183 に答える