MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Subdocumento de atualização do Mongoose, se existir


Então você faz parte do caminho até lá, mas é claro que quando você não encontra um doc então você não terá um doc para trabalhar no retorno de chamada. O MongoDB tem maneiras nativas de lidar com esses tipos de atualizações, mas é claro que você precisa testar a correspondência como você está.

O que podemos fazer aqui é apenas trabalhar dentro do true ou false condição de onde o documento existe.

Considerando vote.value para ser seu true ou false para o "voto positivo"

Onde você achar que existe um documento correspondente, você pode emitir uma atualização como esta:
Question.update(
  { 
    _id: questionId, 
    "votes.createdBy" vote.createdBy,
    "votes.up": {"$ne": vote.value }
  },
  { $set: { "votes.$.up": vote.value } }
);

Para que corresponda e use um posicional $ operador para certificar-se de que o índice correto do item correspondente é atualizado. O que eu adicionei garante que você nem toque no documento onde o vote.vaule já tem o mesmo valor.

E na condição falsa você deseja $push na matriz com o novo item:
Question.update(
  { 
    _id: questionId
  },
  { 
    $push: { 
      "votes": {
        "up": vote.value,
        "createdBy": vote.createdBy
      }
    }
  }
);

Claro, adicione os detalhes de retorno de chamada onde writeConcern é aplicado, o que você provavelmente faz.