我在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']
但是需要很长时间才能完成 我想在一个单一的查询中做到这一点。我如何才能做到这一点?
首先,如果可能的话,在嵌入式列表上创建一个多键索引。
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聚合管道,但这稍微复杂一些。