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

#はじめに
　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()

```javascript
//id1をObjectId
//id2をstringとします
id1 = id1.toString()
if(id1 == id2)console.log(true)
```

```javascript
true
```

　その逆、stringからObjectIdも紹介しておきます。
##new ObjectId()

```javascript
var ObjectId = require('mongodb').ObjectId;
//id1をObjectId
//id2をstringとします
id2 = new ObjectId(id2);
if(id1 == id2)console.log(true);
```

　もしくはエイリアスなのかそれともバージョンの違いなのかはわかりませんが、もうワンパターン同じメソッドを紹介します。new をつける必要がないため、こっちのほうが好きかもしれません。
##ObjectID()

```javascript
var ObjectId = require('mongodb').ObjectID;
//id1をObjectId
//id2をstringとします
id2 = ObjectID(id2);
if(id1 == id2)console.log(true);
```

```javascript
true 
```

　_idが16進数っぽいのでそもそもjavascriptにこんなtoStringとかがあるのかな、と調べてみましたが、やっぱりMongodb特有のもののように思います。

　idはUnix時間とマシンIDとプロセスIDとカウンタによって構成されています。だからidからUnix時間を取得することができます。
##getTimestamp()

```javascript
var ObjectId = require('mongodb').ObjectID;
id = new ObjectId();
console.log(id.getTimestamp());
```

#ここから蛇足
　他に何か_idについて便利なプロパティがないだろうかと検索していたところ、そういえば一覧取得とか出来ないかな、と試してみました。

```javascript
var ObjectId = require('mongodb').ObjectID;
id = new ObjectId();
for(key in id){
 console.log(key);
}
```

```javascript
_bsontype
id
toHexString
get_inc
getInc
generate
toString
toJSON
equals
getTimestamp
generationTime
```

　なるほど。こんなにあるのか。
　それぞれ試して見ます。
##_bsontype

```javascript
var ObjectId = require('mongodb').ObjectID;
id = new ObjectId();
console.log(id._bsontype);
```

```javascript
ObjectID
```

　自分の型を確認するためのプロパティなのでしょうか？

##id

```javascript
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()

```javascript
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()

```javascript
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.get_inc());
```

```javascript
13228467
```

　これは…本当に何なんだ？
　分かる人がいればお教えいただければ。

##getInc()
　見る限りこれは先程のものと同じなのでしょうか？

```javascript
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.get_inc());
console.log(id.getInc());
```

```
12862848
12862849
```

　これはエイリアスということでしょう。

##generate()

```javascript
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()

```javascript
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.toJSON());
console.log(typeof(id.toJSON()));
```

```
611e6de8a6cfd93f7fc2b096
string
```

　これはきっとMongoDB系のデータに使用するものなのでしょう。_idにだけ使っても意味がないということでしょう。

#equals

```javascript
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.equals(null));
console.log(id.equals(id));
```

　あれ、これがあれば序盤の流れ必要なかったんじゃ…？ま、まぁこの記事は散文的なものですし。後でちゃんとまとめる気ですし。

#generationTime

```javascript
var ObjectId = require('mongodb').ObjectID;
id = ObjectId();
console.log(id.getTimestamp());
console.log(id.generationTime);
```

　Timeと書いてるのでエイリアスかなと思ったけど、そういうわけではないみたいです。

```
2021-08-19T14:48:30.000Z
1629384510
```

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