Tengo un esquema en el que el campo de saldo se declara como se muestra a continuación

balance: {
    type: Number,
    min: 0,
    default: 30
}

He establecido 0 como valor mínimo para que el saldo no sea un valor negativo. Pero cuando disminuyo el valor del saldo a través de la consulta de actualización, el saldo resulta ser un valor negativo.

Mi consulta de actualización:

User.update({
    _id: mongoose.Types.ObjectId(id)
}, {
    $inc: {
        balance: -10
    }
}, function(error, result) {
    // code
});

¿Cometí algún error con el código?

2
Shriram Manoharan 23 sep. 2016 a las 13:19

4 respuestas

La mejor respuesta

La validación de Mongoose es un middleware interno que no se llama en la actualización; si desea aplicar validaciones en la actualización, debe buscar el documento, actualizar los atributos y guardarlo.

Por ejemplo:

User.findById(id, function(err, result) {
  if (err) return handleError(err);
  user.balance = -10;
  user.save(function(err) {
    if (err) return handleError(err);
    ...
  });
});
2
MarcoS 23 sep. 2016 a las 10:39

Habilitar la validación en la actualización (que está deshabilitada de manera predeterminada) usando findByIdAndUpdate se vería así:

User.findByIdAndUpdate(id, {
  $set: attributes,
}, {
  new: true,
  runValidators: true,
})
.then((user) => {
  if (!user) {
    // user not found
  }

  console.log(user);
})
.catch(e => console.log(e));
0
Arian Acosta 2 mar. 2018 a las 18:40

Ninguna de estas respuestas responde realmente a la pregunta.

Me encontré con esto e incluso con el indicador runValidators: Mongoose no validará en algunas operaciones. Como a continuación

https://mongoosejs.com/docs/validation.html#update-validators-only-run-for-some-operations

Un último detalle que vale la pena señalar: los validadores de actualización solo se ejecutan en los siguientes operadores de actualización:

$ set

$ unset

$ empujar (> = 4.8.0)

$ addToSet (> = 4.8.0)

$ tirar (> = 4.12.0)

$ pullAll (> = 4.12.0)

Por ejemplo, la siguiente actualización tendrá éxito, independientemente del valor del número, porque los validadores de actualización ignoran $ inc.

3
Community 20 jun. 2020 a las 09:12

De forma predeterminada, la mangosta no valida en una llamada de actualización, sin embargo, hay una opción para esto. Mire la documentación de mongoose: http://mongoosejs.com/docs/validation.html (actualización Validadores)

var opts = { runValidators: true };
Toy.update({}, { color: 'bacon' }, opts, function (err) {
  assert.equal(err.errors.color.message,
    'Invalid color');
});
5
Camo 23 sep. 2016 a las 11:06