いくつかのCRUDコンポーネントを持つNodeでアプリケーションを作成しています。私のデータオブジェクトの1つでは、オブジェクトにコレクション内のIDがある場合レコードを更新するためのメソッドsave()
があります。そうでない場合は新しいドキュメントをアップセットします。さらに、upsertを行う場合は、Mongoによって生成されたドキュメントの_idを取得したいと思います。MongoDB findAndModify()は、更新句にクエリを追加します。
findAndModifyはこれを実行し、実際にはデータベースから_id値を返します。私のクエリ句では、私は_idでフィルタリングしています。私のデータオブジェクトがidを持たない場合、Mongoは正しく返されますが、update
節で設定しているキーに加えて、返される_id値にかかわらず、ドキュメントベースで_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);
}
});
}
私は単にもアップサートにモンゴ-生成された_idを返すために起こる更新のセマンティクスを探しています。私はマップにあるかのように、query
節の値を追加したくありません。私が得ていることを達成する方法はありますか?
私は実際にMongoJSを使用しています。これは、ネイティブMongoドライバのラッパーであり、オブジェクト構文を受け入れるようです。しかし、idクライアントを生成することについてのあなたの意見は最良の解決策であるようです。 私はまだクエリ句の基準が評価されていて、なぜupsertの間にレコードに追加されたのか不思議です。 – DuxPrime
@DuxPrimeこれは設計によるものです。空でないクエリを指定した場合、 "upserting"は、そのクエリと一致するドキュメントがない場合は作成する必要があることを意味し、作成されるレコードに追加されます。 – mpobrien
次は動作するはずです... _id:this.getId()||新しいmongodb.ObjectID() – Tracker1