Sails.js(0.10.x)のModel.native()でIDを指定したクエリーを書く方法
MongoDB on Sails.jsで$inc演算子
を使いたくてnative()でクエリーを実行したところ、ModelのIDを指定するのに手間取ったのでメモ。
実装方法
mongodbモジュールに入っているObjectID
を使用したいのでインストール。mongodbモジュールのObjectIDはbsonモジュールのObjectIDのラッパーなので、インストールするのはbsonでもよい。mongodbの方が今後使いそうな気がしたのでmonbodbにしています。
$ npm install mongodb --save
複数のController/Modelから使いたくなりそうなのでServicesに定義。
api/services/Mongo.js
module.exports = (function() {
var mongo = require('mongodb');
var id = mongo.ObjectID;
return {
ObjectID: id
};
})();
native実行時にid(String)をMongo.ObjectID()に渡してやればOK。また、通常のfind()
やupdate()
でidを指定する場合のkeyはid
ですが、native()
の場合は_idで。mongo的には_idで定義されていて、それをSails.jsがいい感じに変換してくれているので注意。
Message.native(function(err, collection) {
collection.update({_id: Mongo.ObjectID(id)}, {$inc: {like: 1}}, function(err, results) {
res.send(200);
});
});
ちなみに同じことをupdate()でやろうと思うとこうなる。
Message.findOne(id).exec(function(err, message) {
Message.update({id: id}, {like: message.like + 1}).exec(function(err, message) {
res.send(200);
});
});