2012-05-18 9 views
6

Ich habe eine Blog-Sammlung, die Titel, Körper und agrarate Bewertung enthält, die die Benutzer ihnen gegeben haben. Eine weitere Sammlung "Bewertungen", deren Schema sich auf den Blog bezieht, Nutzer, der sie bewertet (wenn überhaupt, bewertet er) in Form ihrer ObjectIds und der vergebenen Bewertung, dh, +1 oder -1.Modellierung von Blogs und Bewertungen in mongodb und nodejs

Wenn ein bestimmte Benutzer navigiert durch Blogs in dem ‚neuesten zuerst‘ bestellt (etwa 40 von ihnen pro Seite. Ihr eine Reihe von blogs[0]-blogs[39] Anruf) ich die Bewertung Dokumente zu diesem bestimmten Benutzer im Zusammenhang abgerufen habe, und die 40 blogs, wenn überhaupt der Benutzer sie bewertet und ihm mitteilen, welche Bewertungen er diesen Blogs gegeben hat.

Ich habe versucht, alle Rating-Dokumente eines bestimmten Benutzers zu extrahieren, in denen Blog Referenz objectIds liegen zwischen blogs[0]._id und blogs[39]._id, die leere Liste in meinem Fall zurückgibt. Kann objectIds nicht mit $lt und $gt Abfragen verglichen werden. Wie soll ich in diesem Fall vorgehen? Sollte ich meine Schemas so umgestalten, dass sie zu diesem Szenario passen?

Ich benutze mongoosejs Treiber für diesen Fall. Hier sind die relevanten Teile des Codes, die ein wenig in der Ausführung unterscheiden, aber Sie bekommen die Idee.

Schemen:

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

Modelle:

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: Während die unter dem Schema der Umsetzung, hatte ich diese Abfrage in Mungo zu tun. 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" }) 

Wie mache ich diese Abfrage in Mungo?

Antwort

4

Eine gute Übung mit MongoDB (und anderen nicht relationalen Datenspeichern) besteht darin, Ihre Daten so zu modellieren, dass sie in Ihrer Anwendung einfach zu verwenden und abzufragen sind. In Ihrem Fall könnten Sie die Struktur ein wenig und speichern Sie die Bewertung direkt im Blog Sammlung Denormalisierung, so ein Blog könnte wie folgt aussehen:

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

Die Idee ist, dass die Objekte in der rates Array enthält alle die Daten, die Sie benötigen, um den Blog-Eintrag mit Bewertungen direkt im einzelnen Dokument anzuzeigen. Wenn Sie die Preise auch auf andere Weise abfragen müssen (z. B. alle Bewertungen von Nutzer X) und die Seite schwer lesen kann, können Sie auch und Daten in einer Rates Sammlung speichern, wie Sie es jetzt tun . Sicher, die Daten sind an zwei Stellen und es ist schwieriger zu aktualisieren, aber es kann ein Gesamtgewinn sein, nachdem Sie Ihre App analysiert haben und wie sie auf Ihre Daten zugreift.

Beachten Sie, dass Sie Indizes tief in die Struktur eines Dokuments anwenden können. So können Sie beispielsweise News.rates.client_id indexieren und dann können Sie schnell alle Dokumente in der News Sammlung finden, die ein bestimmter Benutzer bewertet hat.

+0

ok. Ich habe meine Schemas so geändert, wie du es gesagt hast, aber ich habe immer noch ein Problem damit, wie ich die Bewertungen bekomme, die der Benutzer für einen gegebenen Blogsatz erhält. Können Sie mir bitte auch bezüglich der spezifischen API helfen? @Brandon –

+2

Was ist, wenn es Millionen von Raten für einen Artikel gibt? Ist es ein Problem für diese Art von Schema? – Burak

Verwandte Themen