在MongoDB中过滤元素列表的成员资格
我正在使用Python和Pymongo(不过这个问题在任何语言中都适用),我有一个包含电子邮件的列表,emails=['email1@example.com','email2@example.com',...]
,同时在MongoDB中有一个包含许多文档的集合。每个MongoDB中的文档都有一个email
字段。我想知道,最有效(而且优雅)的方法是什么,来过滤这个Python列表,让它最后只包含那些在MongoDB的email
字段中存在的电子邮件。
输入:emails=['email1@example.com','email2@example.com',...]
输出:filteredEmails=[ <只包含在MongoDB中存在的'email'字段的'emails'子列表
2 个回答
4
我觉得这就是你想要的内容:
> 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
操作符,就可以找到所有邮箱在邮箱列表中的文档。
2
假设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)