[TIL]10月16日:mongodb Object Id


デフォルトではmongodyが集合にデータを入れる場合、ObjectIdを直接入れない限り、自動的にidにObjectId値が付与されて格納されます.

すなわち、idを直接作成することなく、自動的に生成されたObjectId値を使用してデータを操作することができる.
ObjectIdは、12バイトサイズの文字と数字からなる値です.ObjectId()の値を返すと、結果は12バイトの16進数を返します.これらの値にはそれぞれ意味がある.
ObjectId(「315 ae 828340736534 g 4 b 3275」)で説明します.
315ae828/340736534g/4b3275
⬇️
timestamp/random value/counter

  • 315 ae 828:最初の4 bバイトはタイムスタンプ値を表す.この値は、生成されたデータを秒単位で測定します.

  • 3400736534 g:次の5 byteはランダムに生成された値です.

  • 4 b 3275:次の3バイトは増加したcountであり、初期値はランダムに生成される.
  • MongoDBはBSON形式でデータを格納する.
    BSONは、JSONドキュメントをバイナリ形式でエンコードするバイナリJSONの略です.
    当初はMongoDBによって提案されていたが,主にJSON形式のデータを格納したり,ネットワークにデータを転送したりするために用いられる.その利点は、JSON構造にバイナリデータを追加できることです.
    リファレンス
    Ohgyun. 「Bsonを理解する」ミツバチ開発ログ、TISTORY、26 Mar.2019https://ohgyun.com/421.

    BSONの出現


    モンゴDBは当初JSONを利用して開発されたそうです.その後いくつかの問題を発見した.
  • JSONテキストベースの構文解析が遅い.
  • JSONは空間効率の成果とは程遠い.(なかなか話せない…)
    それ以外にも、多くの問題が発生しています.そこで思いついたのがBSON.JSON構造の利点は,機器が素早く読み取れるバイナリ形式として保存することである.
  • JSONでは文字列、boolean、数字、配列を用いて表すことができ、BSONではより詳細に表すことができる.数字はInteger、Float、Long、Decimalに分類でき、日付の形式も格納できます.
    リファレンス
    坤坤「[Mongodb]Mongodbが使用するJSON vs Bson.」クイーンズランド州、TISTORY、11 Mar.201https://koonsland.tistory.com/86.

    PythonにObjectId値を適用


    ObjectIdを文字列に変更します.
    from bson import ObjectId
    oid = ObjectId()
    oid_str = str(oid)
    # oid_str is now '555fc7956cda204928c9dbab'
    文字列をObjectIdに変更します.
    from bson import ObjectId
    oid_str = '555fc7956cda204928c9dbab'
    oid2 = ObjectId(oid_str)
    print(repr(oid2))
    # ObjectId('555fc7956cda204928c9dbab')
    この方法でmongodyのidにアクセスしてデータを操作できます!