如果我对mongodb Ids不区分大小写,我会遇到冲突问题吗?

时间:2014-02-13 02:35:37

标签: mongodb email meteor

我的mongodb数据库中有一个用于流星应用程序的电子邮件令牌集合,我在电子邮件的回复地址(例如@ example.com)中粘贴了这些电子邮件令牌,这样当我解析它时,我知道它与之相关的是什么

我遇到的问题是电子邮件令牌使用默认的_id算法生成唯一ID,该算法会生成一个由大写和小写字符混合的字符串。

但是,我发现有些电子邮件客户端会缩小整个回复地址,这意味着我只能识别不区分大小的地址。

我想现在我有两个选择。

1)最简单的选择是将电子邮件令牌与回复地址不敏感地匹配。在这方面发生冲突的可能性是什么?

2)使电子邮件令牌成为某种guid并生成此guid,而不依赖于mongodb ID的创建。

2 个答案:

答案 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}$

所以似乎区分大小写不是问题。

如果您想使用替代方法,文档中的某个部分可能会作为有用的指南。

http://docs.mongodb.org/manual/core/document/#the-id-field

答案 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的位数。