Node.jsからアクセス


前提

mongoシェルではなく、Node.jsから操作する。


インストール: Node.js用のドライバ

// 専用のディレクトリで
npm init --yes
npm install mongodb

サーバアクセスの流れ

  1. サーバアクセス
  2. データベース指定
  3. コレクション指定
  4. コレクション操作
  5. クライアント閉じる
#!/usr/bin/env node

'use strict'

const MongoClient = require('mongodb').MongoClient
const assert = require('assert')

const port = 27017
// サーバURL
const url = 'mongodb://localhost:' + port
// DB名
const dbName = 'test'
// コレクション名
const cName = 'mybook'

const options = {
  // 非推奨機能をやめる
  useNewUrlParser: true,
  useUnifiedTopology: true
}

// 1. サーバアクセス
MongoClient.connect(url, options, (err, client) => {
  assert.equal(null, err) // エラー確認する場合

  // 2. データベース指定
  const db = client.db(dbName)

  // 3. コレクション指定
  db.collection(cName, (error, collection) => {
    // 4. コレクション操作
    collection.countDocuments((error, result) => {
      console.log('ドキュメント数:', result)
    })
  })

  // 5. クライアント閉じる
  client.close()
})

以降のコード例は、コレクション操作の部分だけ。


挿入

insertOne(): 1件

let doc = { タイトル: '宇宙人失格', 評価: 93 }
collection.insertOne(doc, (err, result) => {
  assert.equal(err, null)
  assert.equal(result.insertedCount, 1) // 1件挿入を確認
  console.log("挿入:", doc)
})

insertMany(): 複数

let arr = [
  { タイトル: '吾輩は犬', 評価: 87 },
  { タイトル: '坊っちゃま'},
]
collection.insertMany(arr, (err, docs) => {
  assert.equal(err, null)
  assert.equal(arr.length, docs.insertedCount) // 件数一致
  console.log("挿入:", arr)
})

検索

findOne(): 1件

let filter = {
  タイトル: '吾輩は犬'
}
collection.findOne(filter, (err, doc) => {
  assert.notEqual(doc, null) // 1つ発見
  console.log("検索:", doc)
})

find(): 複数

let filter = { 評価: { $gt: 80 } }
collection.find(filter).toArray((err, docs) => {
  assert.equal(err, null)
  console.log("検索:", docs)
})

更新

findOneAndUpdate()

let filter = { "タイトル" : "宇宙人失格" }
let update = { $set: { 評価 : 83, 難易度: 'C' } }
let options = { returnOriginal: false } // 更新後ドキュメントを得る
collection.findOneAndUpdate(filter, update, options, (err, result) => {
  assert.equal(err, null)
  console.log("更新:", result.value)
})

削除

findOneAndDelete()

let filter = { "タイトル" : "坊っちゃま" }
collection.findOneAndDelete(filter, (err, result) => {
  assert.equal(err, null)
  console.log("削除:", result.value)
})