2012-05-18 6 views
6

Ho una raccolta di blog che contiene titolo, corpo e classificazione aggregata che gli utenti hanno assegnato loro. Un'altra raccolta 'Valutazioni' il cui schema si riferisce al blog, l'utente che ha valutato (se non li ha valutati) nella forma dei suoi ObjectId e il punteggio che hanno dato, ad es., +1 o -1.Modellazione di blog e classificazioni in mongodb e nodejs

Quando un particolare utente naviga attraverso i blog nel 'più tardi per inizio' ordine (diciamo 40 di loro per pagina. Chiamarli una serie di blogs[0]-blogs[39]) devo recuperare i documenti di rating relativi a questo particolare utente e quelli 40 i blog se l'utente li ha valutati e gli hanno comunicato quali valutazioni ha dato a quei blog.

Ho tentato di estrarre tutti i documenti di valutazione di un particolare utente in cui l'oggetto di riferimento del blog si trova tra blogs[0]._id e blogs[39]._id che restituisce l'elenco vuoto nel mio caso. Può essere oggettivo non può essere confrontato utilizzando le query $lt e $gt. In tal caso, come dovrei farlo? Devo ridisegnare i miei schemi per adattarli a questo scenario?

Sto utilizzando il driver mongoosejs per questo caso. Qui ci sono le parti rilevanti del codice che differiscono un po 'nell'esecuzione ma si ottiene l'idea.

schemi:

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} 
}); 

modelli:

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

Logic:

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){ 
}) 
}) 

Edit: Mentre l'attuazione del sotto di detta schema, ho dovuto fare questa domanda in mangusta. 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" }) 

Come si esegue questa query in mangusta?

risposta

4

Una buona pratica con MongoDB (e altri archivi di dati non relazionali) è quella di modellare i dati in modo che sia facile da usare/interrogare nell'applicazione. Nel tuo caso, si potrebbe considerare denormalizing la struttura un po 'e memorizzare il proprio voto nella raccolta blog, in modo da un blog potrebbe essere simile a questa:

{ 
    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 } 
    ] 
} 

L'idea è che gli oggetti nella matrice rates contiene tutte i dati necessari per visualizzare il post di blog, completo di valutazioni, direttamente nel documento singolo. Se hai anche bisogno di interrogare le tariffe in un altro modo (es. Trovare tutte le valutazioni fatte dall'utente X), e il sito è pesante, potresti considerare anche memorizzare i dati in una collezione Rates come stai facendo ora . Certo, i dati sono in due punti, ed è più difficile da aggiornare, ma potrebbe essere una vittoria generale dopo aver analizzato la tua app e come accede ai tuoi dati.

Si noti che è possibile applicare gli indici in profondità nella struttura del documento, così per esempio è possibile indicizzare News.rates.client_id, e quindi è possibile trovare rapidamente tutti i documenti della collezione News che un particolare utente ha valutato.

+0

ok. Ho cambiato i miei schemi come hai detto, ma ho ancora problemi con il modo in cui ottengo le valutazioni fornite dall'utente per un determinato set di blog. Puoi aiutarmi anche per quanto riguarda l'API specifica? @Brandon –

+2

Cosa succede se ci sono milioni di tariffe per un articolo? È un problema per quel tipo di schema? – Burak