はじめに
Mongodbには_idというMongoDB特有のIDがあります。これを自分から定義するのには、MongoDBshellで扱う場合ですらObjectId()という風にしなくてはいけません。ともかくMongoDBにおける_idの方はstringのような型ではなくて特殊な型をしているようです。node.jsおよびそこから別のプログラムに運び出した際に、エラーの原因になったので、これを解説していきます。
バージョン
・Node.js 15.11.0
・MongoDB 4.4.6
・MongoDBドライバ 7.6.2
ほんぶん
例えばリレーショナルデータベースと同様にデータを最小化するために正規化する場合もあります。そうした場合ですけど、なぜだか_idがstring型に直っている場合があります。そうした場合、if文での評価でtrueになることがありません。そこで使えるメソッド紹介です。
toString()
//id1をObjectId
//id2をstringとします
id1 = id1.toString()
if(id1 == id2)console.log(true)
true
その逆、stringからObjectIdも紹介しておきます。
new ObjectId()
var ObjectId = require('mongodb').ObjectId;
//id1をObjectId
//id2をstringとします
id2 = new ObjectId(id2);
if(id1 == id2)console.log(true);
もしくはエイリアスなのかそれともバージョンの違いなのかはわかりませんが、もうワンパターン同じメソッドを紹介します。new をつける必要がないため、こっちのほうが好きかもしれません。
ObjectID()
var ObjectId = require('mongodb').ObjectID;
//id1をObjectId
//id2をstringとします
id2 = ObjectID(id2);
if(id1 == id2)console.log(true);
true
_idが16進数っぽいのでそもそもjavascriptにこんなtoStringとかがあるのかな、と調べてみましたが、やっぱりMongodb特有のもののように思います。
idはUnix時間とマシンIDとプロセスIDとカウンタによって構成されています。だからidからUnix時間を取得することができます。
getTimestamp()
var ObjectId = require('mongodb').ObjectID;
id = new ObjectId();
console.log(id.getTimestamp());
ここから蛇足
他に何か_idについて便利なプロパティがないだろうかと検索していたところ、そういえば一覧取得とか出来ないかな、と試してみました。
var ObjectId = require('mongodb').ObjectID;
id = new ObjectId();
for(key in id){
console.log(key);
}
_bsontype
id
toHexString
get_inc
getInc
generate
toString
toJSON
equals
getTimestamp
generationTime
なるほど。こんなにあるのか。
それぞれ試して見ます。
_bsontype
var ObjectId = require('mongodb').ObjectID;
id = new ObjectId();
console.log(id._bsontype);
ObjectID
自分の型を確認するためのプロパティなのでしょうか?
id
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.id);
<Buffer 61 1e 6b 37 71 77 f1 3e f8 ca bb a8>
16進数でBufferでの表示をしてくれるみたいです。
toHexString()
var ObjectId = require('mongodb').ObjectID;
id = new ObjectId();
console.log(id.toHexString());
console.log(typeof(id.toHexString()));
console.log(id.toString());
console.log(typeof(id.toString()));
結果を見ればわかりますが型がどうなっているのかよく分からなかったため、そのお試しも含んでいます。
611e69f74b61853eb65d45c6
string
611e69f74b61853eb65d45c6
string
get_inc()
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.get_inc());
13228467
これは…本当に何なんだ?
分かる人がいればお教えいただければ。
getInc()
見る限りこれは先程のものと同じなのでしょうか?
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.get_inc());
console.log(id.getInc());
12862848
12862849
これはエイリアスということでしょう。
generate()
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.generate());
console.log(id.id);
<Buffer 61 1e 6d 52 77 18 86 3f 62 7e 27 ad>
<Buffer 61 1e 6d 52 77 18 86 3f 62 7e 27 ac>
これもまたidのエイリアスということでしょう。
toJSON()
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.toJSON());
console.log(typeof(id.toJSON()));
611e6de8a6cfd93f7fc2b096
string
これはきっとMongoDB系のデータに使用するものなのでしょう。_idにだけ使っても意味がないということでしょう。
equals
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.equals(null));
console.log(id.equals(id));
あれ、これがあれば序盤の流れ必要なかったんじゃ…?ま、まぁこの記事は散文的なものですし。後でちゃんとまとめる気ですし。
generationTime
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.getTimestamp());
console.log(id.generationTime);
Timeと書いてるのでエイリアスかなと思ったけど、そういうわけではないみたいです。
2021-08-19T14:48:30.000Z
1629384510
終わり
何も考えず適当に書き始めたせいで散文的になりましたね。しかし、これは自分自身でもまとめて置きたいので、後ほどまとめを書きましょう。
こんだけ!