node.jsでMongoDBを扱うには mongoose をつかうとすごく楽です。しかし、mongooseを使う際にはスキーマを定義しなければいけません。HTTP POSTのbody(JSON形式)のように何が飛んでくるか分からない場合にもスキーマレスにとりあえず突っ込んでおきたいというときには、Schema.Types.Mixed という型を指定してスキーマを作成すれば、何でも格納でき、JSONデータもそのまま格納できます。
環境
- OS: OS X 10.9.4
- node.js: v0.10.32
- mongoose: v3.8.18
- MongoDB: v2.6.4
下準備:mongooseがなければ、npmでインストールできます。
$ npm install mongoose
ソース
postreceive-mongo.js
var http = require('http');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var dataSchema = new Schema({ data: Schema.Types.Mixed});
var Data = mongoose.model('data', dataSchema);
mongoose.connect('mongodb://localhost/test');
http.createServer(function (req, res) {
if(req.method=='POST') {
var body = '';
req.on('data', function (dat) {
body +=dat;
});
req.on('end',function(){
var doc = new Data({ data: JSON.parse(body) });
doc.save(function(err){
if(err) {
console.log(err);
} else {
console.log(body);
}
});
res.writeHead(200, {'Content-Type':'application/json; charset=utf-8'});
res.end('{"result":"ok"}');
});
}
}).listen(1337, "localhost");
node.js file which saves body of HTTP POST to Mong ...
ただし、これだと "data" というキーの値としてJSONデータが格納されるため、階層が1段深くなってしまいます。それが嫌だという方は、mongo driverを使う方法もあるようです。