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?
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 –
Was ist, wenn es Millionen von Raten für einen Artikel gibt? Ist es ein Problem für diese Art von Schema? – Burak