2012-05-18 15 views
6

Tengo una colección de blogs que contiene el título, el cuerpo y la clasificación de agrregate que los usuarios les han otorgado. Otra colección 'Calificaciones' cuyo esquema hace referencia al blog, el usuario que calificó (si es que lo hace) en la forma de sus ObjectIds y la clasificación que le dieron, es decir, +1 o -1.Modelado de blogs y clasificaciones en mongodb y nodejs

Cuando un usuario en particular navega a través de los blogs en el 'último primero' orden (digamos 40 de ellos por página. Los llamamos una serie de blogs[0]-blogs[39]) Tengo que recuperar los documentos de calificación relacionados con este usuario en particular y los 40 blogs, si es que el usuario los calificó y le notificará qué clasificaciones ha otorgado a esos blogs.

Traté de extraer todos los documentos de calificación de un usuario en particular en el que los objetos de referencia del blog se encuentran entre blogs[0]._id y blogs[39]._id que devuelve la lista vacía en mi caso. Puede ser objeto. No se puede comparar usando las consultas $lt y $gt. En ese caso, ¿cómo debería hacerlo? ¿Debería rediseñar mis esquemas para que se ajusten a este escenario?

Estoy usando el controlador mongoosejs para este caso. Aquí están las partes relevantes del código que difieren un poco en la ejecución, pero usted tiene la idea.

esquemas:

Client= new mongoose.Schema({ 
    ip:String 
}) 

Rates = new mongoose.Schema({ 
    client:ObjectId, 
    newsid:ObjectId, 
    rate:Number 
}) 

News = new mongoose.Schema({ 
    title: String, 
    body: String, 
    likes:{type:Number,default:0}, 
    dislikes:{type:Number,default:0}, 
    created:Date, 
    // tag:String, 
    client:ObjectId, 
    tag:String, 
    ff:{type:Number,default:20} 
}); 

modelos:

var newsm=mongoose.model('News', News); 
var clientm=mongoose.model('Client', Client); 
var ratesm=mongoose.model('Rates', Rates); 

Lógica:

newsm.find({tag:tag[req.params.tag_id]},[],{ sort:{created:-1},limit: buffer+1 },function(err,news){ 

ratesm.find({client:client._id,newsid:{$lte:news[0]._id,$gte:news.slice(-1)[0]._id}},function(err,ratings){ 
}) 
}) 

Editar: Si bien la aplicación de la debajo de dicho esquema, que tenía que hacer esta consulta en la mangosta. js

> db.blogposts.findOne() 
{ title : "My First Post", author: "Jane", 
    comments : [{ by: "Abe", text: "First" }, 
       { by : "Ada", text : "Good post" } ] 
} 
> db.blogposts.find({ "comments.by" : "Ada" }) 

¿Cómo hago esta consulta en mangosta?

Respuesta

4

Una buena práctica con MongoDB (y otras tiendas de datos no relacionales) es modelar sus datos para que sea fácil de usar/consultar en su aplicación. En su caso, usted podría considerar la desnormalización la estructura un poco y almacenar la derecha calificación de la colección del blog, por lo que un blog puede ser algo como esto:

{ 
    title: "My New Post", 
    body: "Here's my new post. It is great. ...", 
    likes: 20, 
    dislikes: 5, 
    ... 
    rates: [ 
    { client_id: (id of client), rate: 5 }, 
    { client_id: (id of another client), rate: 3 }, 
    { client_id: (id of a third client), rate: 10 } 
    ] 
} 

La idea es que los objetos de la matriz rates contiene toda los datos que necesitará para mostrar la entrada del blog, completar con calificaciones, directamente en el documento único. Si también necesita consultar las tarifas de otra manera (por ejemplo, encuentre todas las clasificaciones hechas por el usuario X), y el sitio es de lectura pesada, puede considerar también almacenando los datos en una colección Rates como lo está haciendo ahora . Claro, los datos están en dos lugares, y es más difícil de actualizar, pero puede ser una ganancia general después de analizar su aplicación y cómo accede a sus datos.

Tenga en cuenta que puede aplicar índices profundamente en la estructura de un documento, por ejemplo puede indexar News.rates.client_id, y luego puede encontrar rápidamente cualquier documento en la colección News que un usuario en particular haya calificado.

+0

bien. Cambié mis esquemas como dijiste, pero todavía tengo problemas en cuanto a cómo obtengo las calificaciones otorgadas por el usuario para un determinado conjunto de blogs. ¿Puede por favor también ayudarme con respecto a la API específica? @Brandon –

+2

¿Qué pasa si hay millones de tarifas para un artículo? ¿Es un problema para ese tipo de esquema? – Burak

Cuestiones relacionadas