2012-09-09 15 views
5

pregunta rápida Tengo una lista de articals en mongodb y quiero que los usuarios puedan votar por voto popular o por voto artístico.sistema de votación simple con MongoDB

Mi primera forma sería en la colección artical tener dos filas llamadas upvote y downvote que tendrían números como upvote: 360 downvote: 102;

entonces tendría que pedir esto haciendo una suma upvote-downvote Esto mostraría el total de Me gusta de Artical.

Mi pregunta es en el mongoDB es esta la mejor manera de hacerlo o estoy mejor con un "voto" y luego simplemente ordenarlo por esa votación.

Gracias

Respuesta

7

Cuando usted lo haría de esa manera, no sería realizar un seguimiento de lo que el usuario ya ha votado, por lo que los usuarios pueden votar varias veces. Eso seguramente no es de su interés.

Por eso me gustaría añadir una matriz "útiles" a cada artículo que incluye un objeto por cada voto que identifica unívocamente al usuario que lo hizo:

votes: [ 
     { voter:"name or ID or IP address or some other unique identifier for the person who voted", 
      vote:-1 }, 
     { voter:"someone else", 
      vote:1 }, 
     { voter:"and someone entirely different", 
      vote:-1 } 
    ] 

Cuando se crea un índice único sobre el artículo ID y votos. Votante, ya se ha asegurado de que nadie pueda votar dos veces por un artículo.

Cuando usa un valor de "-1" para downvote y "1" para upvote, puede calcular el puntaje total de un artículo utilizando la función agregada $ sum (También le permitiría introducir votos ponderados más adelante , cuando te apetezca)

+0

gracias. ahora todo lo que tengo que resolver es cómo cuento los votos en ese conjunto que tomo sería simplemente un votes.vote.count(); – RussellHarrower

+1

@Russell todavía puede tener arriba: 60 y abajo: 32 campos como una forma de acceso rápido para contar los votos en el objeto del artículo principal. – halil

Cuestiones relacionadas