example.js:
var mongoose = require('mongoose')
, Schema = mongoose.Schema
mongoose.connect('mongodb://localhost/test')
var Thing = new Schema({
title : String,
content : String
})
Thing.pre('save', function(next){
console.log("saving: %s (%s)", this.title, this.content)
next()
})
var MyThing = mongoose.model('Thing', Thing)
var example = new MyThing({
title : 'foo',
content : 'bar'
})
example.save(function(err){
MyThing.update({title:'foo'},{content:'baz'}, function(err, rs){
console.log(rs)
})
})
出力:
$ node example.js
saving: foo (bar)
1
preは最初の保存によってトリガーされますが、更新によってトリガーされません。
これはバグではありません。 pre saveは、updateが呼び出されたときのモデルではなく、saveメソッドが呼び出されたときにインスタンスで起動するフックです。
Model.updateを使用すると、アトミックな$ set操作をmongodbに直接送信できます。
これは私が欲しい機能です。 スパースデータをアップサーティングするときに特に役立ちます。
私は@martindaleに同意@aheckman、私はUIの私たちがいる場所にいることを感じて$.ajax
フォームは、渡すことによってとして更新req.body._id
ポストルーティングするために、事前の方法のいくつかのタイプが便利だろう。 ユースケースの例は、2つの数値を送信し、合計を計算するためにモデルにpre('save')
を持たせたい場合です。
おそらくpre('update')
ofc
私もこれに気付いたので、これは追加する価値のある拡張機能とは見なされないと思います。
オブジェクトのupdatedOn
日付フィールドを更新する必要がある場合は、aheckmannのアプローチを使用することにしました。 ただし、監査がミドルウェアレベルで使用したいものである場合、このアプローチはにおいがします。
私の場合、日付の設定は、移動する日付と時刻のウィンドウに基づいて更新されたドキュメントをロードするバックグラウンドプロセスがあるため、保存がmongodbにコミットする瞬間に非常に敏感です。 時間のずれが多いと言っているわけではありませんが、aheckmannのアプローチとpre('update')
比較では、保存が行われるまでに、より多くのずれが含まれる可能性があります。
ここでミドルウェアのオプションを見てみたいです。
では、回避策は何ですか? pre( 'save')が更新をキャッチすると予想しましたが、これは意味的には保存のように見えます。 更新は非常に一般的であるため、保存フックの価値が大幅に低下します。
誰かがまだこれを見ているかどうかはわかりませんが、マングースのドキュメントを調べています-
マングース
findAndUpdate()_セクションの_Notesの下に、これが機能しない理由を説明するissues / 964への参照があり
これはクソでたらめです。 セッターでは非同期で何もできません。 ばか。
これは本当に古いスレッドですが、大丈夫です。 実際にこれを混乱させるプレがあります、またはそれはポスト以来理解されています。
それはすべて良いトレントです、私は先に進んでコードを再編成してfindByIdを作成し、次に保存したので、パスワードをソルトするための保存前フックは引き続き機能します。 更新前のフックもあるといいのですが、データを読み取ってisModifedで何らかの変更があったかどうかを確認する必要があるため、操作を処理するには2つのクエリが必要です。
#964にタグを付け、興味を引くためにぶつかります。
最も参考になるコメント
これはバグではありません。 pre saveは、updateが呼び出されたときのモデルではなく、saveメソッドが呼び出されたときにインスタンスで起動するフックです。
Model.updateを使用すると、アトミックな$ set操作をmongodbに直接送信できます。