MongoDBシェルで、と入力するsomeDoc._id
と、Mongoは。のような応答を返しますObjectId(4f6b83af44c75956279e7777)
。その文字列はObjectIdバイトからどのように生成されますか?
他のドライバーのソースへのリンクと同様に、このためのjavascriptソースへのリンクは大歓迎です。
MongoDBシェルで、と入力するsomeDoc._id
と、Mongoは。のような応答を返しますObjectId(4f6b83af44c75956279e7777)
。その文字列はObjectIdバイトからどのように生成されますか?
他のドライバーのソースへのリンクと同様に、このためのjavascriptソースへのリンクは大歓迎です。
それはから来ているように見えBSONElement::toString
ます:
case jstOID:
s << "ObjectId('";
s << __oid() << "')";
break;
そして__oid()
、あなたにaを与え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ブランチを使用していますが、(現在の)マスターは同じです(またはほぼ同じです)。