0
0

More than 3 years have passed since last update.

Node.jsでmongodb特有のIDを使う

Posted at

はじめに

 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

終わり

 何も考えず適当に書き始めたせいで散文的になりましたね。しかし、これは自分自身でもまとめて置きたいので、後ほどまとめを書きましょう。
 こんだけ!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0