Monngoose基礎
基本的な流れ
Mongooseを利用する上でまず把握する必要があるのはスキーマとモデルの存在です。Schema:
どのようなデータを格納するのかの定義
Model:
スキーマをコンパイルして生成される、システムで利用するモデル
これらを踏まえてひとつのケースを追えば、使い方はすぐに理解できます。
UserというオブジェクトをMongoDBに保存したい場合
以下のような流れになります。プログラムではこのようになります。
スキーマ定義→オブジェクト生成&保存
// Userスキーマを作成
var userSchema = new Schema({
name: String,
barthDay: Date,
height: Number
// これらをプロパティと呼ぶ。データ型の他にも必須項目などの制約を付けることができる
});
// データベースとのコネクションを確立
var db = mongoose.createConnection(..);
// スキーマからUserモデルを生成
var User = db.model('User', userSchema);
// モデルからインスタンス生成、データを代入
var user1 = new User({name:"こうた", barthDay: new Date(2007,3,15), height: 30});
var user2 = new User({name:"たいぞう", barthDay: new Date(2011,6,22), height: 30});
// データを保存
user1.save(function(err){
if(err) return handleError(err);
});
データベースから必要なデータを取ってくる場合
var User = db.model('User', userSchema);
User.find({ name: "こうた" }).exec(function(err, users){
console.log(users[0].name); // => 'こうた'
});
データを更新する場合
// TODO
データを削除する場合
user.remove(function (err, user) {
if (err) return handleError(err);
});
こんな感じです。コールバックメソッドがなんとなく読みにくいですがこれが基本的な流れです。最後はスキーマ定義で使うことのできるデータ型とデフォルトで扱うことができる制約についてまとめて基本編は終わりです。
スキーマ定義で扱うことができるデータ型
String : 文字列Number : 数値
Date : 日付
Buffer : Node.jsが提供するバイナリデータ型
Boolean : 真偽
Mixed : 何でもあり(データの変更を監視できない問題あり)
ObjectId : mongooseが提供するオブジェクト固有のID(宣言しなくても自動で保持)
Array : 上記のデータ型、もしくはスキーマ
データ型に付加することができる制約
default : デフォルト値required : このプロパティが必須かどうか
min,max : (Numberのみ)値の上限、下限
enum,match : (Stringのみ)指定された文字配列のどれかか、正規表現にマッチするか
これらを利用する場合にはデータ型の記述の仕方が変わります。
以下スキーマ定義のサンプル
var schema = new Schema({
name: String,
binary: Buffer,
living: Boolean,
updated: { type: Date, default: Date.now } // デフォルト値を使用
age: { type: Number, min: 18, max: 65 } // 数字は18~65の間
mixed: Schema.Types.Mixed, // 何でもあり
array: [], // Arrayの中に何も指定しなければMixedになる
ofString: [String], // String型の配列
ofNumber: [Number],
ofDates: [Date],
ofBuffer: [Buffer],
ofBoolean: [Boolean],
ofMixed: [Schema.Types.Mixed], // [], Array, [{}]でも同じ
})
これでスキーマを生成し、データベースにデータを保存、取得、更新や削除をできるようになりました。今後はオブジェクトにインスタンスメソッドやクラスメソッドを定義し、他のオブジェクトと同じようにプログラム上で使えるようにしたいですね。
次回はさらにスキーマ定義を掘り下げようと思います。

0 件のコメント:
コメントを投稿