0

在 MongoDB shell 中,如果我键入someDoc._id,Mongo 会回复类似ObjectId(4f6b83af44c75956279e7777). 该字符串是如何从ObjectId 字节生成的?

欢迎链接到 javascript 源代码,也欢迎链接到其他驱动程序的源代码。

4

1 回答 1

2

看起来来自BSONElement::toString

case jstOID:
    s << "ObjectId('";
    s << __oid() << "')";
    break;

__oid()给你一个mongo::OID<<运营商电话str

inline StringBuilder& operator<< (StringBuilder& s, const OID& o) { return (s << o.str()); }

这只是调用toHexLower原始字节:

string str() const { return toHexLower(data, 12); }

最后,toHexLower这样做:

inline string toHexLower(const void* inRaw, int len) {
    static const char hexchars[] = "0123456789abcdef";

    StringBuilder out;
    const char* in = reinterpret_cast<const char*>(inRaw);
    for (int i=0; i<len; ++i) {
        char c = in[i];
        char hi = hexchars[(c & 0xF0) >> 4];
        char lo = hexchars[(c & 0x0F)];

        out << hi << lo;
    }

    return out.str();
}

字符串化不是在 JavaScript 中完成的,而是在 C++ 中完成的。

上面使用了 MongoDB 的 2.0 分支,但(当前)master 是相同的(或几乎相同)。

于 2012-04-07T00:42:31.793 回答