过滤MongoDB中成员资格的元素列表

时间:2014-06-18 19:22:38

标签: python mongodb pymongo

所以我使用Python + Pymongo(虽然这个问题可以应用于任何语言),我有一个Python的电子邮件列表,emails=['email1@example.com','email2@example.com',...]我在MongoDB中有一个带有一堆文档的集合。 MongoDB中的每个文档都有一个email字段。过滤Python列表的最有效(和优雅)方法是什么,所以当我完成它时,它只包含MongoDB中email个字段之一的电子邮件?

INPUT:emails=['email1@example.com','email2@example.com',...]

输出:filteredEmails=[ <sublist of 'emails' with only elements present in MongoDB

2 个答案:

答案 0 :(得分:2)

我认为这就是你要找的东西:

> db.people.insert({name:"Fred",email:"fred@email.com"})
> db.people.insert({name:"Derf",email:"derf@email.com"})
> db.people.insert({name:"Bob",email:"bob@email.com"})
>
>
> emails = ["derf@email.com", "bob@email.com"]
[ "derf@email.com", "bob@email.com" ]
> db.people.find({email:{$in: emails}})
{ "_id" : ObjectId("53a1f4b44336adbf6340356a"), "name" : "Derf", "email" : "derf@email.com" }
{ "_id" : ObjectId("53a1f4bb4336adbf6340356b"), "name" : "Bob", "email" : "bob@email.com" }

只需将.find()$in运算符一起使用即可查找电子邮件位于电子邮件列表中的所有文档。

答案 1 :(得分:1)

假设email字段已编入索引,只需查找每个值。这应该足够快。

common_emails = [ email for email in emails if coll.find_one({ 'email': email }) ]

如果集合很小,或者您不想索引email字段,那么在内存中进行交集会更快:

db_emails = [ doc['email'] for doc in coll.find({}, projection = {'email':1, '_id':0}) if doc ]
common_emails = set(emails) & set(db_emails)