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

diseño de esquema mongodb para blogs

Article {
  "_id" : "A",
  "title" : "Hello World",
  "user_id" : 12345,
  "text" : 'My test article',

  "comments" : [
    { 'text' : 'blah', 'user_id' : 654321, 'votes' : [987654]},
    { 'text' : 'foo', 'user_id' : 987654, 'votes' : [12345, 654321] },
    ...
  ]
}

La premisa básica aquí es que he anidado los Comments dentro del Article . Los Votes solo se aplica a un Comment , por lo que se almacenaron como una matriz con cada Comment . En este caso, acabo de almacenar el user_id. Si desea almacenar más información (time_created, etc.), puede votar una serie de objetos:

... 'votes' : [ { user_id : 987654, ts : 78946513 } ] ...

Cómo realizar sus consultas de manera eficiente:

db.articles.find( { _id : 'A' } )

Esto obtiene todo con una consulta. Puede que tenga que hacer algo de lógica del lado del cliente para contar los votos por comentario, pero esto es bastante trivial.

db.articles.ensureIndex( { "comments.user_id" : 1 } )
db.articles.find( { "comments.user_id" : 987654 } ) // returns all document fields

El índice permitirá buscar de manera eficiente los comentarios dentro de un documento.

Actualmente no hay forma de extraer solo las coincidencias de un subconjunto. De hecho, esta consulta devolverá todos los artículos con comentarios de ese usuario. Si esto es potencialmente demasiados datos, puede recortarlos.

db.articles.find( { "comments.user_id" : 987654 }, { "title" : 1, "comments.user_id" : 1 })
db.articles.ensureIndex( { "comments.votes" : 1 } )
db.articles.find( { "comments.votes" : 987654 } )

Nuevamente, esto devolverá todos los artículos, no solo los comentarios.

Aquí hay que hacer una compensación. Devolver el artículo puede parecer que traemos demasiados datos. Pero, ¿qué planea mostrarle al usuario cuando realice la consulta n.º 3?

Obtener una lista de "comentarios por los que he votado" no es terriblemente útil sin el comentario en sí. Por supuesto, el comentario no es muy útil sin el artículo en sí (o al menos solo el título).

La mayoría de las veces, la consulta n. ° 3 se convierte en una combinación de Votes a Comments a Articles . Si ese es el caso, ¿por qué no recuperar los artículos para empezar?