7月 172012
HerokuでMongoDB+Sinatraと同じ、1行メモ的なものをNode.js+Express+mongooseで作った。
mongooseはmongoidと同じ雰囲気のQueryチェインが使えて便利。
MongoDBに接続、スキーマ定義
アドオンのMongoLabかMongoHQを入れてたらそっちに接続するようにした。var mongoose = require('mongoose');
mongoose.connect(process.env.MONGOLAB_URI || process.env.MONGOHQ_URL || 'mongodb://localhost/memo', function(err){
if(err){
console.error(err);
process.exit(1);
}
});
var Schema = mongoose.Schema, ObjectId = Schema.ObjectId;
var MemoSchema = new Schema({
body : {type: String},
created_at : {type: Date, default: Date.now}
});
var Memo = mongoose.model('Memo', MemoSchema);
Memo.latests = function(num){
return this.find().sort('created_at', -1).limit(num);
};
Memo.find_by_id = function(id){
return this.find({'_id':id});
};
読み書き
modelのオブジェクト作ってsaveするとMongoDBに保存される。var mongoose = require('mongoose');
var Memo = mongoose.model('Memo');
var m = new Memo({body: "はい"});
m.save();
代入しても良い。Schema定義した時にgetterが生成されている。
var m = new Memo();
m.body = "はい";
m.save();
Queryを繋げて書けて良い。
var _ = require('underscore');
var mongoose = require('mongoose');
var Memo = mongoose.model('Memo');
Memo.where(body: /はい/).sort('created_at', -1).limit(30).exec(function(err, docs)){
if(err){
console.error('error');
}
else{
_.each(docs, function(i){
console.log(i.body + ' - ' + i.created_at);
});
}
});
さっきschema定義の時にmodelに付けておいたメソッドを使う
Memo.latests(3).exec(function(err, docs){
if(err) console.error(err);
else{
_.each(docs, function(d){
console.log(d.body + ' - ' + d.created_at);
});
}
});
データの出し入れはcontrollerとviewのコードが参考になるかも。
async.parallelで2つのクエリを同時に投げて結果待ちしたりしてみた。なんとなく速そう。
jadeとhamlのちがい
にはまった。この部分
hamlだとこう書くけど
%ul
- memos.each do |memo|
%li
#{memo.body} -
%a(:href => "/#{memo.id}") #{memo.created_at}
jadeだとliと同じ行に書かないと、下のaタグの中身の変数(memo.created_atとか)が展開されなくなる。
ul
- each memo in memos
li #{memo.body} -
a(href="/#{memo.id}") #{memo.created_at}