sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo representar los datos de los comentarios encadenados (junto con la votación de comentarios) en mongodb?

Simplemente almacene los comentarios como desee que se representen en su blog. ¿Quieres comentarios encadenados/anidados? Luego guárdelos de forma anidada:

postId: {
  comments: [
    {
      id: "47cc67093475061e3d95369d" // ObjectId
      title: "Title of comment",
      body: "Comment body",
      timestamp: 123456789,
      author: "authorIdentifier",
      upVotes: 11,
      downVotes: 2,
      comments: [
        {
          id: "58ab67093475061e3d95a684"
          title: "Nested comment",
          body: "Hello, this is a nested/threaded comment",
          timestamp: 123456789,
          author: "authorIdentifier",
          upVotes: 11,
          downVotes: 2,
          comments: [
            // More nested comments
          ]
        }
      ]
    },
    {
      // Another top-level comment
    }
  ]
}

El postId hace referencia a la entrada del blog a la que pertenecen los comentarios y se ha utilizado como clave (o _id en MongoDB) del documento. Cada comentario tiene un id único , para votar o comentar comentarios individuales.

Para obtener los votos agregados, deberá escribir funciones de reducción de mapa en algún lugar a lo largo de estas líneas:

function map() {
  mapRecursive(this.comments)
}

function mapRecursive(comments) {
  comments.forEach(
    function (c) {
      emit(comment.author, { upVotes: c.upVotes, downVotes: c.downVotes });
      mapRecursive(c.comments);
    }
  );
}

function reduce(key, values) {
  var upVotes = 0;
  var downVotes = 0;

  values.forEach(
    function(votes) {
      upVotes += votes.upVotes;
      downVotes += votes.downVotes;
    }
  );

  return { upVotes: upVotes, downVotes: downVotes };
}

No he probado estas funciones y no buscan null valores tampoco. Eso depende de ti :)