我希望有某种方法可以让 $in 查询返回数据库中未找到的电子邮件列表。
你可以使用$nin
. 不幸的是,$ne
并且$nin
不能很好地利用索引,所以这可能不是你最好的选择(但也许值得一试)。
最好的方法可能取决于您的“缓存未命中率”,但如果现有匹配的数量不太高(伪代码),这应该可以工作
var emails;
var matchingMails = users.find({"email" : {$in : emails}}, {"email":1, "_id":0});
var newEmails = emails.subtract(matchingMails); // set difference
db.batchInsert(createUsersFromEmails(newEmails));
IE
使用 查找具有匹配电子邮件地址的所有用户$in
。确保只返回电子邮件字段本身,以便覆盖查询(即 MongoDB 只查看索引本身,而不必扫描文档)
从列表中删除所有已经在数据库中的电子邮件(简单的字符串操作,快速)
批量插入新创建的用户(即在客户端创建一个用户对象列表或数组并将它们发送到数据库)
这限制了到数据库的往返次数。由于查询是索引转换的,因此它将非常非常快,除非您的 RAM 已用尽并且索引不再适合 RAM。
明智的做法是在电子邮件地址上使用唯一索引并允许批量插入完成,即使个别插入失败,以防有人在其间注册或有另一个线程运行此代码。
查询的元素数量$in
不应太高,根据经验,在 1,000 到 10,000 之间。