いまさら聞けないMongoDBの基礎知識とインストール、CRUD操作の基本、モデリングツールMongooseの使い方MEANスタックで始めるWebアプリ開発入門(5)(3/3 ページ)

» 2015年07月14日 05時00分 公開
[中村修太クラスメソッド株式会社]
前のページへ 1|2|3       

Node.jsからMongooseモジュールでMongoDBをCRUD操作

connect関数でデータベースに接続し、コールバックを設定

 mongo-sampleディレクトリにapp.jsファイルを作成し、下記のように記述します。

//app.js
var mongoose = require('mongoose');
//book-storeデータベースへ接続
var con = mongoose.connect('mongodb://localhost/book-store');
var db = con.connection;
 
//接続エラー時にコールバック実行
db.on('error', console.error.bind(console, 'connection error:'));
 
//接続成功時にコールバック実行
db.once('open', function (callback) {
    console.log("connect successfully")
});

 Mongooseモジュールをrequireし、connect関数でデータベースに接続します。connection情報のerrorイベントやopenイベントを使用すれば、接続成功/失敗時のハンドリングも可能です。

model関数でモデルを定義

 Mongooseではモデルを定義し、それに対して処理を行うことでコレクション/ドキュメントの操作を行います。モデルは次のように、mongoose.Schemaオブジェクトを使って定義します。

・
・
var Schema = mongoose.Schema;
 
var bookSchema = new Schema({
    _id:Number,
    title: String,
    price: Number,
    publishDate: Date,
    author: { type: Number, ref: 'Author' }
});
 
var authorSchema = new Schema({
    _id:Number,
    name: String,
    books : [{ type: Schema.Types.ObjectId, ref: 'Book' }]
});
 
var Book = mongoose.model('Book', bookSchema);
var Author = mongoose.model('Author', authorSchema);

 サンプルでは「Book」と「Author」モデルを定義しています。各モデルは、Schemaオブジェクトを使用してフィールド名と型を指定し、model関数で登録します。

 また、モデル同士は関連を持たせることも可能になっています。上記例ではBookモデルはAuthorモデルを参照しています。

save関数でドキュメントの登録

 ドキュメントを登録してみましょう。Authorモデルを作成してsave関数で登録した後、コールバックでBookモデルを登録します。

・
・
var authorModel = new Author();
authorModel._id = 1;
authorModel.name = "taro";
authorModel.save(function(err){
   if(err) {
       console.error(err);
   } else {
       var bookModel = new Book();
       bookModel._id = 100;
       bookModel.title = "JavaScriptリファレンス";
       bookModel.price = 100;
       bookModel.publishDate = new Date();
       bookModel.author = authorModel._id;
       bookModel.save(function(err,book){
           if(err) {
               console.error(err);
           } else {
               console.log("bookModel saved:" + book)
           }
       });
   }
});

 Bookオブジェクトを作成する際にauthorフィールドにauthorModelの_idを設定していることに注意してください。これでBookとAuthorが関連付けられます。

 コンソールで「node app.js」と入力し、上記サンプルを実行した後、Mongo shellでコレクションを確認してみましょう。

> use book-store
> show collections
authors
books
system.indexes

 authorsとbooksが存在していることが分かります。

findOne関数でデータを1件取得

 登録したデータの取得も試してみましょう。findOne関数を使用すれば、条件に合うデータを1件取得します。

Book.findOne({"title" : "JavaScriptリファレンス"})
  .populate("author").exec(function(err, book) {
    if(err) throw new Error(err);
    console.log(book);
});

 ここではpopulate関数も使用し、Bookが持つAuthorオブジェクトも同時に取得しています。findOneを実行して取得した結果を表示すると、次のようになります。

//bookの中身
{ _id: 100,
  author: { _id: 1, name: 'taro', __v: 0, books: [] },
  publishDate: Mon Jun 15 2015 18:02:01 GMT+0900 (JST),
  price: 100,
  title: 'JavaScriptリファレンス',
  __v: 0 }

 bookモデルがauthorモデルを持っているのが分かりますね。

 ちなみに、Mongo shellでbooksとauthorsを表示すると、次のように表示されます。

> db.books.find()
{ "_id" : 100, "author" : 1, "publishDate" : ISODate("2015-06-15T09:02:01.835Z"), "price" : 100, "title" : "JavaScriptリファレンス", "__v" : 0 }
> db.authors.find()
{ "_id" : 1, "name" : "taro", "books" : [ ], "__v" : 0 }

 それぞれ別のコレクションのドキュメントとして表示されているのが分かります。

 モデル同士を関連付けて登録し、populateを使用して取得すれば、一つのモデルとして取得できます。

update関数で更新処理

 更新はupdate関数で条件と内容を指定して行います。また、オプションでupsertも指定できます。

Book.update({ title: 'JavaScriptリファレンス' }, { $set: {price: 200} },
            { upsert: false}, function(err) {
   if(err) {
     console.log(err);
   } else {
     console.log("update success.");
   }
});

remove関数でドキュメントの削除

 ドキュメントの削除はremove関数を使います。

Book.remove({ title: 'JavaScriptリファレンス' }, function(err) {
   if(err) {
     console.log(err);
   } else {
     console.log("delete success.");
   }
});

次回はMVWフレームワーク「AngularJS」について

 今回はMEANスタックアプリのデータベース担当、ドキュメント指向データベースであるMongoDBの概要からMongooseを用いてデータベースにアクセスする方法を紹介しました。

 Mongooseではモデルを定義することで、コレクション/ドキュメントの操作が直感的になって扱いやすくなったと思います。

 Mongooseモジュールの詳細な使い方は、下記リンクを参照してください。

 次回は、フロントエンドのJavaScript用MVWフレームワーク、AngularJSについて紹介する予定です。

著者紹介

中村修太(なかむら しゅうた)

中村修太

クラスメソッド勤務の新しもの好きプログラマーです。数年前に東京から山口県に引っ越し、現在もリモート勤務しています。最近の趣味は空手とぬか漬け作り。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。