我在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在单个查询中执行相同的操作。我不确定语法是否100%,但是我认为这应该可行:
exists = set([])
results = collection.find({"list":{"$elemMatch":{"$in":mylist}}})
for result in results:
exists.update(result.list)
这样做的缺点是,您会将所有与任何项目匹配的记录发送到python客户端,然后让python进行提取和整理。
您还可以在服务器端进行提取和排序,并通过使用mongo聚合管道将匹配项的聚合列表仅发送到python客户端,但这稍微复杂一些。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句