私は次のインデックスを持っています:
PaymentSchema.index({ driver_id: 1, year: 1, month: 1 },{ unique: true });
したがって、このコレクションには、異なるフィールドの組み合わせごとに 1 つのレコードのみを保持する必要がありますdriver_id, year and month
。upsert
オプションでコレクションを更新したい:
var query = {
driver_id: req.params.driver_id,
year: req.params.year,
month: req.params.month,
amount: req.params.old_value
};
var update = {
$set: {
amount: req.params.new_value
}
};
var options = {
upsert: true
};
Payment.update(query,update,options,function(err,rows){
if(err) return next(err);
res.json({});
});
したがって、指定された一意のキー (driver_id+year+month) と追加の条件でドキュメントを更新する必要がありますamount = ...
。クエリ条件に問題がなければ、ドキュメントを更新する必要があります - そしてそれは機能します。この条件でドキュメントが見つからず、一意のインデックスを持つドキュメントが存在しない場合は、それが作成されます。ただし、一意のインデックスを持つドキュメントが存在する場合 (金額条件のみが正しくない)、同じ一意のインデックス (driver_id + 年 + 月) で新しいドキュメントが作成されます。これらの3つのフィールド(driver_id + year + month)で一意のインデックスを宣言したため、奇妙です.mongoshellで、これらのフィールドが同じ2つのドキュメントが存在することがわかります...