我的mongodb数据库中有一个用于流星应用程序的电子邮件令牌集合,我在电子邮件的回复地址(例如@ example.com)中粘贴了这些电子邮件令牌,这样当我解析它时,我知道它与之相关的是什么
我遇到的问题是电子邮件令牌使用默认的_id算法生成唯一ID,该算法会生成一个由大写和小写字符混合的字符串。
但是,我发现有些电子邮件客户端会缩小整个回复地址,这意味着我只能识别不区分大小的地址。
我想现在我有两个选择。
1)最简单的选择是将电子邮件令牌与回复地址不敏感地匹配。在这方面发生冲突的可能性是什么?
2)使电子邮件令牌成为某种guid并生成此guid,而不依赖于mongodb ID的创建。
答案 0 :(得分:1)
Meteor正在生成它自己的Id,它与MongoDB ObjectId不同。如上所述,在转换案例或检查案例不敏感时,这些可能会发生冲突。这很有趣,我不确定该项目的原因。
引擎盖下的mongodb节点本机驱动程序。因此,如果要使用它们,ObjectId创建函数应该可用。
https://github.com/mongodb/js-bson/blob/master/lib/bson/objectid.js#L68-L74
重要的部分是这些电话:
value.toString(16)
因此,对于十六进制或所有字符0-9a-f,此处的基数设置为16。
你也可以在驱动程序中注意到他们会像这样检查Regex:
^[0-9a-fA-F]{24}$
所以似乎区分大小写不是问题。
如果您想使用替代方法,文档中的某个部分可能会作为有用的指南。
答案 1 :(得分:1)
是的,你会遇到问题。 Meteor在其17个字符的id值中使用大写和小写值。您可以查看Random
包中的代码:https://github.com/meteor/meteor/tree/devel/packages/random。
因此,有可能获得两个不同的值,其差异只能是套管。如果客户端的电子邮件应用程序将地址转换为小写字符,则可能会导致混淆。
在您的情况下,最好不要使用Random.id()
,而应使用自己的随机字符生成器。这样的事情可能有用:
var lowerCaseId = function() {
var digits = [],
self = this;
for (var i = 0; i < 17; i++) {
digits[i] = Random.choice("23456789abcdefghijkmnopqrstuvwxyz");
}
return digits.join("");
};
同样值得注意的是,流星_id
值是由“不可错误的字符”构成的 - 没有任何字符可以引起混淆,例如0 vs O,1 vs I等。
如果您不在_id
字段中使用它,则必须使用此值生成一个值,并在插入数据库之前检查它是否存在,或者使用唯一索引。< / p>
另外还要注意熵会有显着下降,因为随着大写字符的丢失,可能的组合数量会下降。如果这对您很重要,您可以在上面的代码中增加17的位数。