MongoDB JSONファイルからOracle NoSQL Databaseへの移行

この例では、Oracle NoSQL Database Migratorを使用して、MongoDB形式のデータをOracle NoSQL Databaseにコピーする方法を示します。

ユースケース

複数のオプションを評価した後、組織はOracle NoSQL DatabaseをNoSQL Databaseプラットフォームとして最終決定します。表とデータはMongoDBにあり、組織は両方をOracle NoSQL Databaseに移行する必要があります。

ソース構成テンプレートでファイルまたはディレクトリを指定することで、MongoDBからエクスポートした移行用のJSONデータを含むファイルまたはディレクトリをコピーできます。

このユースケースを示すためのMongoDBからエクスポートされた次の2つのサンプルJSONファイルについて考えてみます。

MongoDB形式のJSONファイルの例を次に示します:
{"_id":0,"name":"Aimee Zank","scores":[{"score":1.463179736705023,"type":"exam"},{"score":11.78273309957772,"type":"quiz"},{"score":35.8740349954354,"type":"homework"}]}
{"_id":1,"name":"Aurelia Menendez","scores":[{"score":60.06045071030959,"type":"exam"},{"score":52.79790691903873,"type":"quiz"},{"score":71.76133439165544,"type":"homework"}]}
{"_id":2,"name":"Corliss Zuk","scores":[{"score":67.03077096065002,"type":"exam"},{"score":6.301851677835235,"type":"quiz"},{"score":66.28344683278382,"type":"homework"}]}
{"_id":3,"name":"Bao Ziglar","scores":[{"score":71.64343899778332,"type":"exam"},{"score":24.80221293650313,"type":"quiz"},{"score":42.26147058804812,"type":"homework"}]}
{"_id":4,"name":"Zachary Langlais","scores":[{"score":78.68385091304332,"type":"exam"},{"score":90.2963101368042,"type":"quiz"},{"score":34.41620148042529,"type":"homework"}]}
MongoDBで実行されているSpringアプリケーションからエクスポートされたMongoDB形式のJSONファイルのサンプルを次に示します:
{"_id":{"$oid":"63d3a87cf564fc21dac3838d"},"firstName":"John","lastName":"Smith","address":{"Country":"France"},"_class":"com.example.demo.Customer"}
{"_id":{"$oid":"63d3a87cf564fc21dac3838e"},"firstName":"Sam","lastName":"David","address":{"Country":"USA"},"_class":"com.example.demo.Customer"} 
{"_id":"3","firstName":"Dona","lastName":"William","address":{"Country":"England"},"_class":"com.example.demo.Customer"}

MongoDBは、標準モードおよび緩和モードの2種類の拡張をフォーマットされたJSONファイルに対してサポートしています。mongoexportツールを使用して正規モードまたは緩和モードで生成されるMongoDB形式のJSONファイルを指定できます。NoSQL Database Migratorでは、両方のモードがサポートされています。

MongoDB Extended JSON (v2)ファイルの詳細は、mongoexport_formatsを参照してください。

MongoDB形式のJSONファイルの生成の詳細は、mongoexportを参照してください。

このデモでは、MongoDB形式のJSONファイルをOracle NoSQL Databaseに移行する方法について説明します。この例では、手動で作成した構成ファイルを使用します。
前提条件
  • 移行するソースとシンクを指定します。
    • ソース: MongoDB形式のJSONファイル
    • シンク: Oracle NoSQL Database
  • mongoexportユーティリティを使用して、MongoDBからデータを抽出します。詳細は、mongoexportを参照してください。
手順

MongoDB形式のJSONデータをOracle NoSQL Databaseに移行するには、次のいずれかのオプションを選択できます:

  1. 識別されたソースおよびシンクの詳細を含む構成ファイル(JSON形式)を準備します。ソース構成テンプレート およびシンク構成テンプレート を参照してください。

    ここでは、defaultSchema構成パラメータをtrueに設定します。このため、NoSQL Database Migratorは、シンクにデフォルト・スキーマで表を作成します。
    {
      "source" : {
        "type" : "file",
        "format" : "mongodb_json",
        "dataPath" : "<complete/path/to/the/MongoDB/Formatted/JSON/file>"
      },
      "sink" : {
        "type" : "nosqldb",
        "storeName" : "kvstore",
        "helperHosts" : ["phoenix126166:5000"],
        "table" : "mongoImport",
        "includeTTL" : true,
        "schemaInfo" : {
          "defaultSchema" : true
        },
        "overwrite" : true,
        "requestTimeoutMs" : 5000
      },
      "abortOnError" : true,
      "migratorVersion" : "1.7.0"
    }
    
    MongoDB形式のJSONファイル・ソースのデフォルト・スキーマは次のとおりです:
    CREATE TABLE IF NOT EXISTS <tablename>(id STRING, document JSON,PRIMARY KEY(SHARD(id));
    説明:
    • tablename = 構成のtable属性に指定された値。
    • id = MongoDBでエクスポートされたJSONソース・ファイルの各ドキュメントの_id値。
    • document = MongoDBでエクスポートされたファイル内のドキュメントごとに、_idフィールドを除く内容がdocument列に集約されます。

    ノート:

    <tablename>表がOracle NoSQL Databaseにすでに存在し、defaultSchema構成を使用して表にデータを移行する場合は、既存の表に小文字(id)のID列があり、型がSTRINGであることを確認する必要があります。
  2. コマンド・プロンプトを開き、NoSQL Database Migratorユーティリティを展開したディレクトリに移動します。

  3. 構成ファイルを渡して、runMigratorコマンドを実行します。--configまたは-cオプションを使用します。
    $./runMigrator --config <complete/path/to/the/JSON/config/file>
    
  4. 次に示すように、ユーティリティはデータの移行に進みます。
    creating source from given configuration:
    source creation completed
    creating sink from given configuration:
    sink creation completed
    creating migrator pipeline
    [nosqldb sink] : start loading DDLs
    [nosqldb sink] : executing DDL: CREATE TABLE IF NOT EXISTS mongoImport (id STRING, document JSON, PRIMARY KEY(SHARD(id)))
    [nosqldb sink] : completed loading DDLs
    migration started
    Start writing data to OnDB Sink
    executing for source:mongoDBSample
    [mongo file source] : start parsing MongoDB JSON records from file: mongoDBSample.json
    Writing data to OnDB Sink completed.
    migration completed.
    Records provided by source=5, Records written to sink=5, Records failed=0,Records skipped=0.
    Elapsed time: 0min 0sec 108ms
    Migration completed.

確認

KVStoreでSQLプロンプトを起動します。
 java -jar lib/sql.jar -helper-hosts localhost:5000 -store kvstore
mongoImport表がソース・データで作成されていることを確認します:

sql-> select * from mongoImport;
{"id":"4","document":{"name":"Zachary Langlais","scores":[{"score":78.68385091304332,"type":"exam"},{"score":90.2963101368042,"type":"quiz"},{"score":34.41620148042529,"type":"homework"}]}}
{"id":"1","document":{"name":"Aurelia Menendez","scores":[{"score":60.06045071030959,"type":"exam"},{"score":52.79790691903873,"type":"quiz"},{"score":71.76133439165544,"type":"homework"}]}}
{"id":"2","document":{"name":"Corliss Zuk","scores":[{"score":67.03077096065002,"type":"exam"},{"score":6.301851677835235,"type":"quiz"},{"score":66.28344683278382,"type":"homework"}]}}
{"id":"3","document":{"name":"Bao Ziglar","scores":[{"score":71.64343899778332,"type":"exam"},{"score":24.80221293650313,"type":"quiz"},{"score":42.26147058804812,"type":"homework"}]}}
{"id":"0","document":{"name":"Aimee Zank","scores":[{"score":1.463179736705023,"type":"exam"},{"score":11.78273309957772,"type":"quiz"},{"score":35.8740349954354,"type":"homework"}]}}

5 rows returned
  1. 識別されたソースおよびシンクの詳細を含む構成ファイル(JSON形式)を準備します。ソース構成テンプレート およびシンク構成テンプレート を参照してください。

    ここでは、ソース構成テンプレートのschemaPathパラメータで、シンク表のDDL文を含むファイルを指定します。それに応じて、シンク構成テンプレートのuseSourceSchema構成パラメータをtrueに設定します。

    カスタム・スキーマは次のように生成できます:

    • MongoDB形式のJSONデータからの各列の名前とデータ型に注意してください。この情報を使用して、Oracle NoSQL Database表のスキーマDDLファイルを作成します。
    • スキーマ・ファイルで、最初の列(主キー)にidという名前を付け、INTEGER型にします。残りの列として、MongoDB形式のJSONファイルに記録されているとおりの同じ名前と型を含めます。
    • スキーマ・ファイルを保存し、完全なパスをメモします。
    この例では、次のユーザー定義スキーマが使用されています:
    CREATE TABLE IF NOT EXISTS sampleMongoDBImp (id INTEGER, name STRING, scores JSON, PRIMARY KEY(SHARD(id)));
    表の作成時に_id列をidに変換するようにNoSQL Database Migratorに指示するrenameFields変換を含める必要があります。パラメータの詳細は、「変換構成テンプレート」を参照してください。NoSQL Database Migratorは、シンクにカスタム・スキーマで表を作成します。
    
    {
      "source" : {
        "type" : "file",
        "format" : "mongodb_json",
        "schemaInfo" : {
          "schemaPath" : "<complete/path/to/the/schema/file>"
        },
        "dataPath" : "<complete/path/to/the/MongoDB/Formatted/JSON/file>"
      },
      "sink" : {
        "type" : "nosqldb",
        "storeName" : "kvstore",
        "helperHosts" : ["phoenix126166:5000"],
        "table" : "sampleMongoDBImp",
        "includeTTL" : true,
        "schemaInfo" : {
          "useSourceSchema" : true
        },
        "overwrite" : false,
        "requestTimeoutMs" : 5000
      },
      "transforms": {
        "renameFields" : {
          "_id":"id"
        }
      },
      "abortOnError" : true,
      "migratorVersion" : "1.7.0"
    }
  2. コマンド・プロンプトを開き、NoSQL Database Migratorユーティリティを展開したディレクトリに移動します。

  3. 構成ファイルを渡して、runMigratorコマンドを実行します。--configまたは-cオプションを使用します。
    $./runMigrator --config <complete/path/to/the/JSON/config/file>
    
  4. 次に示すように、ユーティリティはデータの移行に進みます。
    creating source from given configuration:
    source creation completed
    creating sink from given configuration:
    sink creation completed
    creating migrator pipeline
    [nosqldb sink] : start loading DDLs
    [nosqldb sink] : executing DDL: CREATE TABLE IF NOT EXISTS sampleMongoDBImp (id INTEGER, name STRING, scores JSON, PRIMARY KEY(SHARD(id)))
    [nosqldb sink] : completed loading DDLs
    migration started
    Start writing data to OnDB Sink
    executing for source:mongoDBSample
    [mongo file source] : start parsing MongoDB JSON records from file: mongoDBSample.json
    Writing data to OnDB Sink completed.
    migration completed.
    Records provided by source=5, Records written to sink=5, Records failed=0,Records skipped=0.
    Elapsed time: 0min 0sec 72ms
    Migration completed.

確認

KVStoreでSQLプロンプトを起動します。
 java -jar lib/sql.jar -helper-hosts localhost:5000 -store kvstore
sampleMongoDBImp表がソース・データで作成されていることを確認します:
sql-> select * from sampleMongoDBImp;
{"id":0,"name":"Aimee Zank","scores":[{"score":1.463179736705023,"type":"exam"},{"score":11.78273309957772,"type":"quiz"},{"score":35.8740349954354,"type":"homework"}]}
{"id":2,"name":"Corliss Zuk","scores":[{"score":67.03077096065002,"type":"exam"},{"score":6.301851677835235,"type":"quiz"},{"score":66.28344683278382,"type":"homework"}]}
{"id":1,"name":"Aurelia Menendez","scores":[{"score":60.06045071030959,"type":"exam"},{"score":52.79790691903873,"type":"quiz"},{"score":71.76133439165544,"type":"homework"}]}
{"id":3,"name":"Bao Ziglar","scores":[{"score":71.64343899778332,"type":"exam"},{"score":24.80221293650313,"type":"quiz"},{"score":42.26147058804812,"type":"homework"}]}
{"id":4,"name":"Zachary Langlais","scores":[{"score":78.68385091304332,"type":"exam"},{"score":90.2963101368042,"type":"quiz"},{"score":34.41620148042529,"type":"homework"}]}

5 rows returned

JSONコレクションは、データベース内の複数のJSONドキュメントを格納および管理するように設計されています。固定スキーマを必要とせず、各ドキュメントに独自の柔軟な構造を持たせることができます。この例では、MongoDB形式のJSONファイルをJSONコレクションに移行する方法を示します。

  1. 識別されたソースおよびシンクの詳細を含む構成ファイル(JSON形式)を準備します。ソース構成テンプレート およびシンク構成テンプレート を参照してください。

    Oracle NoSQL DatabaseでJSONコレクション表を作成する場合は、スキーマ内の入力のMongoDB形式のJSONに従って、主キーとその型のみを定義する必要があります。他のすべての属性は、JSONドキュメントの一部として格納されるため、スキーマ・ファイルに明示的に定義する必要はありません。

    この例では、次のユーザー定義スキーマが使用されています:

    CREATE TABLE IF NOT EXISTS sampleMongoDBJSONCollection (id INTEGER, PRIMARY KEY(SHARD(id))) AS JSON COLLECTION

    表の作成時に、_id列をidに変換するようにNoSQL Database Migratorに指示するrenameFields変換を含める必要があります。パラメータの詳細は、「変換構成テンプレート」を参照してください。NoSQL Database Migratorは、シンクにカスタム・スキーマで表を作成します。

    {
    "source" : {
      "type" : "file",
      "format" : "mongodb_json",
      "schemaInfo" : {
       "schemaPath" : "<complete/path/to/schema/file>"
      },
      "dataPath" : "</complete/path/to/the/MongoDB/Formatted/JSON/file>"
     },
     "sink" : {
      "type" : "nosqldb",
      "storeName" : "kvstore",
      "helperHosts" : ["<localhost:5000>"],
      "table" : "sampleMongoDBJSONCollection",
      "includeTTL" : true,
      "schemaInfo" : {
       "useSourceSchema" : true
      },
      "overwrite" : false,
      "requestTimeoutMs" : 5000
     },
     "transforms" : {
      "renameFields" : {
       "_id" : "id"
      }
     },
     "abortOnError" : true,
     "migratorVersion" : "1.7.0"
    }
  2. コマンド・プロンプトを開き、NoSQL Database Migratorユーティリティを抽出したディレクトリに移動します。
  3. 構成ファイルを渡して、runMigratorコマンドを実行します。--configまたは-cオプションを使用します。
    ./runMigrator --config <complete/path/to/the/JSON/config/file>
  4. 次に示すように、ユーティリティはデータの移行に進みます。
    [INFO] creating source from given configuration:
    [INFO] source creation completed
    [INFO] creating sink from given configuration:
    [INFO] sink creation completed
    [INFO] creating migrator pipeline
    [INFO] [nosqldb sink] : start loading DDLs
    [INFO] [nosqldb sink] : executing DDL: CREATE TABLE IF NOT EXISTS sampleMongoDBJSONCollection (id INTEGER, PRIMARY KEY(SHARD(id))) AS JSON COLLECTION
    [nosqldb sink] : completed loading DDLs
    [INFO] migration started
    [INFO] Start writing data to OnDB Sink
    [INFO] executing for source:mongo_json
    [mongo file source] : start parsing MongoDB JSON records from file: mongo_json.json
    [INFO] Writing data to OnDB Sink completed.
    [INFO] migration completed.
    Records provided by source=5, Records written to sink=5, Records failed=0,Records skipped=0.
    Elapsed time: 0min 0sec 122ms
    Migration completed.

確認

KVStoreでSQLプロンプトを起動します。

java -jar lib/sql.jar -helper-hosts localhost:5000 -store kvstore

sampleMongoDBJSONCollection表がソース・データで作成されていることを確認します:

sql-> select * from sampleMongoDBJSONCollection;
{"id":2,"name":"Corliss Zuk","scores":[{"score":67.03077096065002,"type":"exam"},{"score":6.301851677835235,"type":"quiz"},{"score":66.28344683278382,"type":"homework"}]}
{"id":4,"name":"Zachary Langlais","scores":[{"score":78.68385091304332,"type":"exam"},{"score":90.2963101368042,"type":"quiz"},{"score":34.41620148042529,"type":"homework"}]}
{"id":0,"name":"Aimee Zank","scores":[{"score":1.463179736705023,"type":"exam"},{"score":11.78273309957772,"type":"quiz"},{"score":35.8740349954354,"type":"homework"}]}
{"id":1,"name":"Aurelia Menendez","scores":[{"score":60.06045071030959,"type":"exam"},{"score":52.79790691903873,"type":"quiz"},{"score":71.76133439165544,"type":"homework"}]}
{"id":3,"name":"Bao Ziglar","scores":[{"score":71.64343899778332,"type":"exam"},{"score":24.80221293650313,"type":"quiz"},{"score":42.26147058804812,"type":"homework"}]}
5 rows returned
  1. このユースケースでは、SpringアプリケーションからエクスポートされたMongoDB形式のJSONファイルのサンプルをソースとして使用します。この形式の詳細は、Springデータを参照してください。
  2. 識別されたソースおよびシンクの詳細を含む構成ファイル(JSON形式)を準備します。ソース構成テンプレート およびシンク構成テンプレート を参照してください。

    ここでは、ソース構成テンプレートのschemaPathパラメータで、シンク表のDDL文を含むファイルを指定します。それに応じて、シンク構成テンプレートのuseSourceSchema構成パラメータをtrueに設定します。

    カスタム・スキーマは次のように生成できます:

    • MongoDB形式のJSONデータからの各列の名前とデータ型に注意してください。この情報を使用して、Oracle NoSQL Database表のスキーマDDLファイルを作成します。
    • スキーマ・ファイルで、最初の列(主キー)にidという名前を付け、STRING型にします。残りのフィールドを、Springデータの形式に準拠して、JSON型のkv_json_という名前のフィールドに集約します。詳細は、Springデータ・フレームワークの永続性モデルを参照してください。
    • スキーマ・ファイルを保存し、完全なパスをメモします。
    この例では、次のユーザー定義スキーマが使用されています:
    CREATE TABLE IF NOT EXISTS sampleMongoDBSpringImp (id STRING, kv_json_ JSON, PRIMARY KEY(SHARD(id)));
    前述のSpringデータ・サンプルには、次の変換を含める必要があります:
    • _id列をidに変換するためのrenameFields変換
    • _class列を無視し、シンク表に含めないためのignoreFields変換
    • 残りのフィールド(id以外)をJSON型のフィールドに集約するためのaggregateFields変換
    パラメータの詳細は、「変換構成テンプレート」を参照してください。NoSQL Database Migratorは、シンクにカスタム・スキーマで表を作成します。
    
    {
      "source": {
        "type": "file",
        "format": "mongodb_json",
        "schemaInfo": {
          "schemaPath": "<complete/path/to/the/schema/file>"
        },
        "dataPath": "<complete/path/to/the/MongoDB/Formatted/JSON/file>"
      },
      "sink": {
        "type": "nosqldb",
        "storeName": "kvstore",
        "helperHosts": ["phoenix126166:5000"],
        "table": "sampleMongoDBSpringImp",
        "includeTTL": true,
        "schemaInfo": {
          "useSourceSchema": true
        },
        "overwrite": false,
        "requestTimeoutMs": 5000
      },
      "transforms": {
        "renameFields": {
          "_id": "id"
        },
        "ignoreFields": [
          "_class"
        ],
        "aggregateFields": {
          "fieldName": "kv_json_",
          "skipFields": ["id"]
        }
      },
      "abortOnError": true,
      "migratorVersion" : "1.7.0"
    }
  3. コマンド・プロンプトを開き、NoSQL Database Migratorユーティリティを展開したディレクトリに移動します。

  4. 構成ファイルを渡して、runMigratorコマンドを実行します。--configまたは-cオプションを使用します。
    $./runMigrator --config <complete/path/to/the/JSON/config/file>
    
  5. 次に示すように、ユーティリティはデータの移行に進みます。
    creating source from given configuration:
    source creation completed
    creating sink from given configuration:
    sink creation completed
    creating migrator pipeline
    [nosqldb sink] : start loading DDLs
    [nosqldb sink] : executing DDL: CREATE TABLE IF NOT EXISTS sampleMongoDBSpringImp (id STRING, kv_json_ JSON, PRIMARY KEY(SHARD(id)))
    [nosqldb sink] : completed loading DDLs
    migration started
    Start writing data to OnDB Sink
    executing for source:onpremisesample
    [mongo file source] : start parsing MongoDB JSON records from file: onpremisesample.json
    Writing data to OnDB Sink completed.
    migration completed.
    Records provided by source=3, Records written to sink=3, Records failed=0,Records skipped=0.
    Elapsed time: 0min 0sec 145ms
    Migration completed.

確認

KVStoreでSQLプロンプトを起動します。
 java -jar lib/sql.jar -helper-hosts localhost:5000 -store kvstore
sampleMongoDBSpringImp表がソース・データで作成されていることを確認します:
sql-> select * from sampleMongoDBSpringImp;
{"id":"63d3a87cf564fc21dac3838e","kv_json_":{"address":{"Country":"USA"},"firstName":"Sam","lastName":"David"}}
{"id":"63d3a87cf564fc21dac3838d","kv_json_":{"address":{"Country":"France"},"firstName":"John","lastName":"Smith"}}
{"id":"3","kv_json_":{"address":{"Country":"England"},"firstName":"Dona","lastName":"William"}}

3 rows returned