[OCI]MongoDBクライアントからAutonomous JSON Databaseに接続してみた（Node.jsアプリケーション編）

# はじめに

これまでの以下の記事で、Oracle Database API for MongoDBを利用することによりMongoDB Shell、mongoexport/mongoimportなどのMongoDBクライアントからAutonomous JSON Databaseを操作できることを確認しました。

[[OCI]MongoDBクライアントからAutonomous JSON Databaseに接続してみた（MongoDB Shell編）](https://qiita.com/500InternalServerError/items/20f646bc38725dea580b)
[[OCI]MongoDBクライアントからAutonomous JSON Databaseに接続してみた（mongoexport/mongoimport編）](https://qiita.com/500InternalServerError/items/a03003e7979d62a4b019)

今回は、MongoDBの使用を前提に書かれているアプリケーションが、接続先をAutonomous JSON Databaseに変更するだけで動作するかを確認しました。

# 1.INSERT（insertOne()/insertMany()）とSELECT（find()）
検証のために、MongoDBに対するINSERT処理とSELECT処理を含むNode.jsのアプリケーションを作成しました。
（Node.js初心者なので、コードが美しくないのはご容赦ください）

```insert.js
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
var async = require('async');

var url = "mongodb://admin:Demo%231Demo%231@127.0.0.1:27017/mongo?authSource=admin";
//var url = "mongodb://mongo:Demo%231Demo%231@XXXXXXXXXX-AJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/mongo?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true";

console.log("Connected to  " + url + "\n");

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  var dbo = db.db("mongo");
  var coll = "dept";

  async.series([
// ----------------------------------------------------------------------
// Insert Single Row
// ----------------------------------------------------------------------
    function (callback) {
      var obj = {"deptno":10,"deptname":"ACCOUNTING","location":"NEW YORK"};
      dbo.collection(coll).insertOne(obj, function(err, res) {
        if (err) throw err;
        console.log("Inserted 1 document into collection " + coll + ".\n");
        callback(null, "first");
      });
    },
// ----------------------------------------------------------------------
// Select All Rows
// ----------------------------------------------------------------------
    function (callback) {
      dbo.collection(coll).find().toArray(function(err, result) {
        if (err) throw err;
        console.log("Select All documents in collection " + coll + ".\n");
        console.log(result);
        console.log();
        callback(null, "second");
      });
    },
// ----------------------------------------------------------------------
// INSERT Multiple Rows
// ----------------------------------------------------------------------
    function (callback) {
      var obj = [
        {"deptno":20,"deptname":"RESEARCH","location":"DALLAS"},
        {"deptno":30,"deptname":"SALES","location":"CHICAGO"},
        {"deptno":40,"deptname":"OPERATIONS","location":"BOSTON"}
      ];
      dbo.collection(coll).insertMany(obj, function(err, res) {
        if (err) throw err;
        console.log("Inserted 3 document into collection " + coll + ".\n");
        callback(null, "third");
      });
    },
// ----------------------------------------------------------------------
// Select All Rows
// ----------------------------------------------------------------------
    function (callback) {
      dbo.collection(coll).find().toArray(function(err, result) {
        if (err) throw err;
        console.log("Select All documents in collection " + coll + ".\n");
        console.log(result);
        console.log();
        callback(null, "fourth");
      });
    },
  ],
  function (err, results) {
    if (err) {
      throw err;
    }
    db.close();
    console.log('All done. ');
  });
});
```
まずは接続先をローカルのMongoDBにして実行してみます。

```
[opc@work3 mongo]$ node insert.js 
Connected to  mongodb://admin:Demo%231Demo%231@127.0.0.1:27017/mongo?authSource=admin

Inserted 1 document into collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48b"),
    deptno: 10,
    deptname: 'ACCOUNTING',
    location: 'NEW YORK'
  }
]

Inserted 3 document into collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48b"),
    deptno: 10,
    deptname: 'ACCOUNTING',
    location: 'NEW YORK'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48c"),
    deptno: 20,
    deptname: 'RESEARCH',
    location: 'DALLAS'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48d"),
    deptno: 30,
    deptname: 'SALES',
    location: 'CHICAGO'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48e"),
    deptno: 40,
    deptname: 'OPERATIONS',
    location: 'BOSTON'
  }
]

All done. 
[opc@work3 mongo]$ 
```
当然ですが、問題なく実行されました。
次に、接続先のみをAutonomous JSON Databaseに変えて実行してみます。

```
[opc@work3 mongo]$ node insert.js 
Connected to  mongodb://mongo:Demo%231Demo%231@XXXXXXXXXX-AJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/mongo?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true

Inserted 1 document into collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba701a695c59e54bea6ed"),
    deptno: 10,
    deptname: 'ACCOUNTING',
    location: 'NEW YORK'
  }
]

Inserted 3 document into collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba701a695c59e54bea6ee"),
    deptno: 20,
    deptname: 'RESEARCH',
    location: 'DALLAS'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6ef"),
    deptno: 30,
    deptname: 'SALES',
    location: 'CHICAGO'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6f0"),
    deptno: 40,
    deptname: 'OPERATIONS',
    location: 'BOSTON'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6ed"),
    deptno: 10,
    deptname: 'ACCOUNTING',
    location: 'NEW YORK'
  }
]

All done. 
[opc@work3 mongo]$
```
こちらも問題なく実行できました
INSERT処理、SELECT処理をおこなうMongoDBのアプリケーションが、接続先を変更しただけで、そのままAutonomous JSON Databaseで実行できることが確認できました。

# 2.UPDATE（updateOne()/UpdateMany()）
次はUPDATE処理を含むアプリケーションです。

```update.js
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
var async = require('async');

//var url = "mongodb://admin:Demo%231Demo%231@127.0.0.1:27017/mongo?authSource=admin";
var url = "mongodb://mongo:Demo%231Demo%231@XXXXXXXXXX-AJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/mongo?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true";

console.log("Connected to  " + url + "\n");

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  var dbo = db.db("mongo"); //DB名
  var coll = "dept"; //コレクション名

  async.series([
// ----------------------------------------------------------------------
// Update Single Row
// ----------------------------------------------------------------------
    function (callback) {
      var where = {deptno: 10};
      var set = {$set: {location: "NY"}};
      dbo.collection(coll).updateOne(where, set, function(err, result) {
        if (err) throw err;
        console.log("Updated 1 document in collection " + coll + ".\n");
        callback(null, "first");
      });
    },
// ----------------------------------------------------------------------
// Select All Rows
// ----------------------------------------------------------------------
    function (callback) {
      dbo.collection(coll).find().toArray(function(err, result) {
        if (err) throw err;
        console.log("Select All documents in collection " + coll + ".\n");
        console.log(result);
        console.log();
        callback(null, "second");
      });
    },
// ----------------------------------------------------------------------
// Update All Rows
// ----------------------------------------------------------------------
    function (callback) {
      var where = {};
      var set = {$set: {country: "USA"}};
      dbo.collection(coll).updateMany(where, set, function(err, result) {
        if (err) throw err;
        console.log("Updated All documents in collection " + coll + ".\n");
        callback(null, "third");
      });
    },
// ----------------------------------------------------------------------
// Select All Rows
// ----------------------------------------------------------------------
    function (callback) {
      dbo.collection(coll).find().toArray(function(err, result) {
        if (err) throw err;
        console.log("Select All documents in collection " + coll + ".\n");
        console.log(result);
        console.log();
        callback(null, "fourth");
      });
    },
  ],
  function (err, results) {
    if (err) {
      throw err;
    }
    db.close();
    console.log('All done.' );
  });
});
```
まずは接続先をローカルのMongoDBにして実行してみます。

```
[opc@work3 mongo]$ node update.js 
Connected to  mongodb://admin:Demo%231Demo%231@127.0.0.1:27017/mongo?authSource=admin

Updated 1 document in collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48b"),
    deptno: 10,
    deptname: 'ACCOUNTING',
    location: 'NY'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48c"),
    deptno: 20,
    deptname: 'RESEARCH',
    location: 'DALLAS'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48d"),
    deptno: 30,
    deptname: 'SALES',
    location: 'CHICAGO'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48e"),
    deptno: 40,
    deptname: 'OPERATIONS',
    location: 'BOSTON'
  }
]

Updated All documents in collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48b"),
    deptno: 10,
    deptname: 'ACCOUNTING',
    location: 'NY',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48c"),
    deptno: 20,
    deptname: 'RESEARCH',
    location: 'DALLAS',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48d"),
    deptno: 30,
    deptname: 'SALES',
    location: 'CHICAGO',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48e"),
    deptno: 40,
    deptname: 'OPERATIONS',
    location: 'BOSTON',
    country: 'USA'
  }
]

All done.
[opc@work3 mongo]$ 
```
当然ですが、問題なく実行されました。
次に、接続先のみをAutonomous JSON Databaseに変えて実行してみます。

```
[opc@work3 mongo]$ node update.js 
Connected to  mongodb://mongo:Demo%231Demo%231@XXXXXXXXXX-AJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/mongo?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true

Updated 1 document in collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba701a695c59e54bea6ee"),
    deptno: 20,
    deptname: 'RESEARCH',
    location: 'DALLAS'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6ef"),
    deptno: 30,
    deptname: 'SALES',
    location: 'CHICAGO'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6f0"),
    deptno: 40,
    deptname: 'OPERATIONS',
    location: 'BOSTON'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6ed"),
    deptno: 10,
    deptname: 'ACCOUNTING',
    location: 'NY'
  }
]

Updated All documents in collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba701a695c59e54bea6ee"),
    deptno: 20,
    deptname: 'RESEARCH',
    location: 'DALLAS',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6ef"),
    deptno: 30,
    deptname: 'SALES',
    location: 'CHICAGO',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6f0"),
    deptno: 40,
    deptname: 'OPERATIONS',
    location: 'BOSTON',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6ed"),
    deptno: 10,
    deptname: 'ACCOUNTING',
    location: 'NY',
    country: 'USA'
  }
]

All done.
[opc@work3 mongo]$ 
```
こちらも問題なく実行できました
UPDATE処理をおこなうMongoDBのアプリケーションが、接続先を変更しただけで、そのままAutonomous JSON Databaseで実行できることが確認できました。

#3 .DELETE（deleteOne()/deleteMany()）
最後はDELETE処理を含むアプリケーションです。

```delete.js
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
var async = require('async');

//var url = "mongodb://admin:Demo%231Demo%231@127.0.0.1:27017/mongo?authSource=admin";
var url = "mongodb://mongo:Demo%231Demo%231@SYA6VPHK3PZLKHQ-AJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/mongo?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true";

console.log("Connected to  " + url + "\n");

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  var dbo = db.db("mongo"); //DB名
  var coll = "dept"; //コレクション名

  async.series([
// ----------------------------------------------------------------------
// Delete Single Row
// ----------------------------------------------------------------------
    function (callback) {
      var where = {deptno: 10};
      dbo.collection(coll).deleteOne(where, function(err, result) {
        if (err) throw err
        console.log("Deleted 1 document in collection " + coll + ".\n");
        callback(null, "first");
      });
    },
// ----------------------------------------------------------------------
// Select All Rows
// ----------------------------------------------------------------------
    function (callback) {
      dbo.collection(coll).find().toArray(function(err, result) {
        if (err) throw err;
        console.log("Select All documents in collection " + coll + ".\n");
        console.log(result);
        console.log();
        callback(null, "second");
      });
    },
// ----------------------------------------------------------------------
// Delete All Rows
// ----------------------------------------------------------------------
    function (callback) {
      var where = {};
      dbo.collection(coll).deleteMany(where, function(err, result) {
        if (err) throw err;
        console.log("Deleted All documents in collection " + coll + ".\n");
        callback(null, "third");
      });
    },
// ----------------------------------------------------------------------
// Select All Rows
// ----------------------------------------------------------------------
    function (callback) {
      dbo.collection(coll).find().toArray(function(err, result) {
        if (err) throw err;
        console.log("Select All documents in collection " + coll + ".\n");
        console.log(result);
        console.log();
        callback(null, "fourth");
      });
    },
  ],
  function (err, results) {
    if (err) {
        throw err;
    }
    db.close();
    console.log('All done.');
  });
});
```
まずは接続先をローカルのMongoDBにして実行してみます。

```
[opc@work3 mongo]$ node delete.js 
Connected to  mongodb://admin:Demo%231Demo%231@127.0.0.1:27017/mongo?authSource=admin

Deleted 1 document in collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48c"),
    deptno: 20,
    deptname: 'RESEARCH',
    location: 'DALLAS',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48d"),
    deptno: 30,
    deptname: 'SALES',
    location: 'CHICAGO',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba8c870e8cfc3e3c3e48e"),
    deptno: 40,
    deptname: 'OPERATIONS',
    location: 'BOSTON',
    country: 'USA'
  }
]

Deleted All documents in collection dept.

Select All documents in collection dept.

[]

All done.
[opc@work3 mongo]$ 
```
当然ですが、問題なく実行されました。
次に、接続先のみをAutonomous JSON Databaseに変えて実行してみます。

```
[opc@work3 mongo]$ node delete.js 
Connected to  mongodb://mongo:Demo%231Demo%231@SYA6VPHK3PZLKHQ-AJD1.adb.ap-tokyo-1.oraclecloudapps.com:27017/mongo?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true

Deleted 1 document in collection dept.

Select All documents in collection dept.

[
  {
    _id: new ObjectId("61eba701a695c59e54bea6ee"),
    deptno: 20,
    deptname: 'RESEARCH',
    location: 'DALLAS',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6ef"),
    deptno: 30,
    deptname: 'SALES',
    location: 'CHICAGO',
    country: 'USA'
  },
  {
    _id: new ObjectId("61eba701a695c59e54bea6f0"),
    deptno: 40,
    deptname: 'OPERATIONS',
    location: 'BOSTON',
    country: 'USA'
  }
]

Deleted All documents in collection dept.

Select All documents in collection dept.

[]

All done.
[opc@work3 mongo]$ 
```
こちらも問題なく実行できました
DELETE処理をおこなうMongoDBのアプリケーションが、接続先を変更しただけで、そのままAutonomous JSON Databaseで実行できることが確認できました。

# まとめ
Oracle Database API for MongoDBを利用することで、MongoDBを使用するNode.jsアプリケーションが、接続先を変更するだけでAutonomous JSON Databaseに接続して利用できることが確認できました。