所以我使用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
答案 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)