如何在mongodb上使用pymongo进行多重查询?

问题描述 投票:1回答:1

我在mongodb上有一个集合,其中有1000个对象,就像这个。

{
"_id":3,
"list": ["item1","item2", "item3"]
}

我有一个10项的Python列表。我想检查这个集合中的任何一个对象是否有列表中的值。

我试过这样做。

from pymongo import MongoClient

mylist = ["item4","item5", "item6", "item1"]
database_uri = "mongodb_uri"
client = MongoClient(database_uri)

collection = client["database"]["collection"]
exists = []
for i in mylist:
    data = collection.find_one({"list":i})
    if data:
        exists.append(i)
print (exists)

结果:

['item1']

但是需要很长时间才能完成 我想在一个单一的查询中做到这一点。我如何才能做到这一点?

python-3.x mongodb pymongo
1个回答
1
投票

首先,如果可能的话,在嵌入式列表上创建一个多键索引。

db.collection.createIndex({"list":1})

这将增加大量的存储空间, 但它将提高你的查询响应时间。

接下来,你可以在单个查询中使用$or或$in.I不是100%确定语法,但我认为这应该可以。

exists = set([])
results = collection.find({"list":{"$elemMatch":{"$in":mylist}}})
for result in results:
  exists.update(result.list)

这样做的缺点是,你会把所有与任何项目相匹配的记录 发送到你的python客户端,让python来进行提取和排序。

你也可以在服务器端进行提取和排序,只将匹配项的聚合列表发送到python客户端,通过使用mongo聚合管道,但这稍微复杂一些。

© www.soinside.com 2019 - 2024. All rights reserved.