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

Modelagem/atualizações de dados do Mongo para votação (para cima e para baixo)


Parece muito mais simples usar o segundo esquema.
Document:  { name: "name",
             upvoters: [name1, name2, etc],
             downvoters: [name1, name2, etc],
           }

Para obter o total de votos, você pode obter o doc e usedoc.upvoters.length-doc.downvoters.length (iniciar cada documento com os arrays upvoters e downvoters sendo [ ])

Para registrar qualquer upvote do usuário "x" no item "c" basta fazer:
db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}})

Isso é atômico e tem a vantagem de fazer a mesma coisa mesmo se você executá-lo 10 vezes. Também poupa você de ter que verificar se "x" já votou em "c" e de que maneira.

Para gravar downvote basta inverter:
db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})