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イベントを使用すれば、接続成功/失敗時のハンドリングも可能です。
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モデルを参照しています。
ドキュメントを登録してみましょう。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件取得します。
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関数で条件と内容を指定して行います。また、オプションでupsertも指定できます。
Book.update({ title: 'JavaScriptリファレンス' }, { $set: {price: 200} },
{ upsert: false}, function(err) {
if(err) {
console.log(err);
} else {
console.log("update success.");
}
});
ドキュメントの削除はremove関数を使います。
Book.remove({ title: 'JavaScriptリファレンス' }, function(err) {
if(err) {
console.log(err);
} else {
console.log("delete success.");
}
});
今回はMEANスタックアプリのデータベース担当、ドキュメント指向データベースであるMongoDBの概要からMongooseを用いてデータベースにアクセスする方法を紹介しました。
Mongooseではモデルを定義することで、コレクション/ドキュメントの操作が直感的になって扱いやすくなったと思います。
Mongooseモジュールの詳細な使い方は、下記リンクを参照してください。
次回は、フロントエンドのJavaScript用MVWフレームワーク、AngularJSについて紹介する予定です。
MongoDBとRavenDBの違いから読み解く、ドキュメント・データベースごとの設計思想
ドキュメント指向のNoSQLデータベース(CouchDB、MongoDB)編
Node.js、MongoDBでデータの保存Copyright © ITmedia, Inc. All Rights Reserved.