いくつかのCRUDコンポーネントを持つNodeでアプリケーションを作成しています。私のデータオブジェクトの1つに、オブジェクトにsave()
コレクションで見つかったIDがある場合はレコードを更新し、そうでない場合は新しいドキュメントをアップサートすることを目的としたメソッドがあります。さらに、アップサートを行う場合は、Mongoによって生成されたドキュメントの_idを取得したいと思います。
findAndModifyがこれを行うようであり、実際、データベースから_id値を返します。クエリ句では、_idでフィルタリングしています。データオブジェクトにIDがない場合、Mongoは正しくアップサートを実行しますが、返される_id値に関係なく、update
句で設定しているキーに加えて、に基づいてドキュメントに_idも設定します。query
句で使用した値。明確にするためのいくつかのコード:
User.prototype.save = function(callback) {
var that = this;
var args = {
'query' : { _id: this.getId() }, //getId() returns empty string if not set
'update' : { $set : {
firstName : this.firstName,
lastName : this.lastName,
email : this.email
//_id : this.getId()
// which is blank, is magically getting added due to query clause
}},
'new' : true,
'upsert' : true,
'fields' : {'_id' : true}
};
this.db.collection(dbName).findAndModify(args, function(err, doc){
if(!that.getId()) {
that.setId(doc._id);
}
if (typeof(callback) === "function"){
callback.call(that);
}
});
}
私は単に、更新のセマンティクスを探しています。これは、アップサートでMongoによって生成された_idを返すこともあります。句の値を、マップquery
内にあるかのように追加したくありません。update
私が得ていることを達成する方法はありますか?