いまさら聞けないMongoDBの基礎知識とインストール、CRUD操作の基本、モデリングツールMongooseの使い方:MEANスタックで始めるWebアプリ開発入門(5)(3/3 ページ)
MEANスタックを用いたWebアプリの開発方法について紹介していく連載。今回は、ドキュメント指向データベース「MongoDB」の概要とセットアップの仕方、コマンドで基本的なCRUD操作をする方法、MongoDB用モデリングツール「Mongoose」の使い方と、Node.jsからMongooseモジュールでMongoDBを操作する方法などについて。
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について紹介する予定です。
- AngularJSユーザーのためのAngular2超入門
- AngularJSを使いこなすなら絶対に知っておきたいフィルタとカスタムディレクティブの基本
- AngularJSの「サービス」で理解するDI(Dependency Injection:依存性注入)の基本
- Web開発者が覚えておきたい、よく使うAngularJSのビルトインディレクティブ12選まとめ
- AngularJSの理解で欠かせないコントローラーとas記法、データバインディングの基本的な使い方
- いまさら聞けないAngularJSの基礎知識と5つの主な特徴、インストール、簡単な使い方
- いまさら聞けないMongoDBの基礎知識とインストール、CRUD操作の基本、モデリングツールMongooseの使い方
- Node.jsのMVCフレームワーク「Express」における静的ファイル、ルーティング定義、セッション管理、エラー処理
- Node.jsのMVCフレームワーク「Express」の基礎知識とインストール
- いまさら聞けないNode.jsの基礎知識とnpm、Gulpのインストール
- LAMPに代わる構成として注目のMEANスタックの基礎知識とインストール、ひな型作成
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
MongoDBとRavenDBの違いから読み解く、ドキュメント・データベースごとの設計思想
MongoDBと同じ「ドキュメント・データベース」であるRavenDBの特徴を見てみよう。そこから設計思想の違いが見えてくる。
ドキュメント指向のNoSQLデータベース(CouchDB、MongoDB)編
連載ではNoSQLを特性から分類して、主要プロダクトの特性を紹介してきました。今回は、利用者も多いドキュメント指向NoSQL2つを見ていきましょう。後半では連載全体の「まとめのまとめ」も。
Node.js、MongoDBでデータの保存
Node.jsとSocket.IO、MongoDBを使用して、Webページの更新内容がリアルタイムにView画面に反映されるサイトを作ってみた- Meteorでチャットアプリを作ってしまったよ