如何使用pymongo在mongodb上使用多个查询?

lindroid先生

我在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章