2012-04-19 8 views
3

いくつかの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節の値を追加したくありません。私が得ていることを達成する方法はありますか?

答えて

2

あなたはすでに_idを持っているので、新しいnew require('mongodb').ObjectID() を使って_idクライアント側を生成することができます。次に、通常のアップサンプリングを行います(findandmodifyを行う必要はありません)。

findAndModifyを使用している場合、ノードドライバはオブジェクトとしてではなく(通常のmongoシェルのように)、この関数の引数を位置的に受け入れることに注意してください。ノードドライバとfindandmodify行う 正しい形式は次のようになります

collection.findAndModify(criteria, sort, update[, options, callback])

(オプションおよびコールバックは任意のparamsです)。ここでの完全なドキュメント: https://github.com/mongodb/node-mongodb-native/blob/master/docs/insert.md

+0

私は実際にMongoJSを使用しています。これは、ネイティブMongoドライバのラッパーであり、オブジェクト構文を受け入れるようです。しかし、idクライアントを生成することについてのあなたの意見は最良の解決策であるようです。 私はまだクエリ句の基準が評価されていて、なぜupsertの間にレコードに追加されたのか不思議です。 – DuxPrime

+1

@DuxPrimeこれは設計によるものです。空でないクエリを指定した場合、 "upserting"は、そのクエリと一致するドキュメントがない場合は作成する必要があることを意味し、作成されるレコードに追加されます。 – mpobrien

+1

次は動作するはずです... _id:this.getId()||新しいmongodb.ObjectID() – Tracker1

関連する問題