0

私は次のインデックスを持っています:

PaymentSchema.index({ driver_id: 1, year: 1, month: 1 },{ unique: true });

したがって、このコレクションには、異なるフィールドの組み合わせごとに 1 つのレコードのみを保持する必要がありますdriver_id, year and monthupsertオプションでコレクションを更新したい:

    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つのドキュメントが存在することがわかります...

4

1 に答える 1