在 MongoDB shell 中,如果我键入someDoc._id
,Mongo 会回复类似ObjectId(4f6b83af44c75956279e7777)
. 该字符串是如何从ObjectId 字节生成的?
欢迎链接到 javascript 源代码,也欢迎链接到其他驱动程序的源代码。
在 MongoDB shell 中,如果我键入someDoc._id
,Mongo 会回复类似ObjectId(4f6b83af44c75956279e7777)
. 该字符串是如何从ObjectId 字节生成的?
欢迎链接到 javascript 源代码,也欢迎链接到其他驱动程序的源代码。
看起来来自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 是相同的(或几乎相同)。