sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongoose actualiza el subdocumento si existe

Así que eres parte del camino hacia allí, pero, por supuesto, cuando no encuentras un doc entonces no tendrás un doc para trabajar con en la devolución de llamada. MongoDB tiene formas nativas de manejar este tipo de actualizaciones, pero, por supuesto, debe probar la coincidencia como eres.

Lo que podemos hacer aquí es simplemente trabajar dentro del true o false condición de donde existe el documento.

Teniendo en cuenta vote.value ser tu true o false por el "voto a favor"

Cuando encuentre que hay un documento coincidente, puede emitir una actualización como esta:

Question.update(
  { 
    _id: questionId, 
    "votes.createdBy" vote.createdBy,
    "votes.up": {"$ne": vote.value }
  },
  { $set: { "votes.$.up": vote.value } }
);

Entonces eso coincide y usa un positional $ operador para asegurarse de que el índice correcto del elemento coincidente se actualiza. Lo que agregué allí asegura que ni siquiera toques el documento donde está el vote.vaule ya tiene el mismo valor.

Y en la condición falsa, desea $push en la matriz con el nuevo elemento:

Question.update(
  { 
    _id: questionId
  },
  { 
    $push: { 
      "votes": {
        "up": vote.value,
        "createdBy": vote.createdBy
      }
    }
  }
);

Por supuesto, agregue los detalles de devolución de llamada donde writeConcern se aplica, lo que probablemente hagas.