mongooseの糞サンプル

model/post.js

var Mongoose = require('mongoose');
var mongoose = new Mongoose.Mongoose();
var db = mongoose.connect('mongodb://localhost:27017/db_name');

var Schema = Mongoose.Schema;
var ObjectId = Schema.ObjectId;

var Tag = new Schema({
    name : { type : String, default : '' }
});

var Post = new Schema({
    title : { type : String, required : true },
    msg : { type : String, required : true },
    posted_at : { type : Date, default : Date.now },
    view_counter : { type : Number, required : true },
    tag : [Tag]
});

mongoose.model('Post', Post, 'Post', false);
module.exports = db.model('Post');

dao/post.js

var EventEmitter = require('events').EventEmitter;
var Post = require('../model/post'); // path to post.js

var dao = exports.dao = {
    save : function(query){
        var ev = new EventEmitter();
        var post = new Post(query);
        post.save(function(error){
            if(error){
                console.log('save_log:', error);
                ev.emit('error');
            }else{
                ev.emit('end', post);
            }
        });
        return ev;
    },
    find_by_id : function(id){
        var ev = new EventEmitter();
        Post.findById(id, [], {}, function(error, post){
            if(!error && post){
                ev.emit('end', post);
            }else if(!error){
                ev.emit('end', []);
            }else{
                console.log('find_by_id_log:', error);
                ev.emit('error');
            }
        });
        return ev;
    },
    find : function(query, options){
        var ev = new EventEmitter();
        Post.find(query, [], options, function(error, posts){
            if(!error && posts){
                ev.emit('end', posts);
            }else if(!error){
                ev.emit('end', []);
            }else{
                console.log('find_log:',error);
                ev.emit('error');
            }
        });
        return ev;
    },
    update : function(id, query){
        var ev = new EventEmitter();
        Post.update({ _id : id }, query, function(error){
            if(error){
                console.log('update_log:', error);
                ev.emit('error');
            }else{
                ev.emit('end');
            }
        });
        return ev;
    },
    remove : function(id){
        var ev = new EventEmitter();
        Post.remove({ '_id' : id }, function(error){
            if(!error){
                console.log('remove_log:', error);
                ev.emit('end');
            }else{
                console.log(error);
                ev.emit('error');
            }
        });
        return ev;
    }
};

service/post.js

var EventEmitter = require('events').EventEmitter;
var post_dao = require('../dao/post').dao; // path to post.js

var service = exports.service = {
    find : function(query){
        var ev = new EventEmitter();
        var searching_posts = post_dao.find(query);
        searching_posts.on('end', function(posts){
            if(posts.length > 0){
                ev.emit('end', posts);
            }else{
                ev.emit('error')
            }
        });
        searching_posts.on('error', function(){
            ev.emit('error');
        });
        return ev;
    },
    // 以下同様
};

mongooseはソースも使い勝手もよい。GridFSはサポートする気ないらしい。