在mongodb和nodejs中build模博客和评级

我有一个博客集合,包含用户给他们的标题,正文和集合评级。 另一个收集“评级”,其架构参考博客,用户评估(如果他根据所有评级)他们的ObjectIdsforms和评级,即+1或-1。

当一个特定的用户按照“最新的第一个”顺序浏览博客时(比如说,每个页面有40个blogs[0]称他们为blogs[0]blogs[39] )。我必须检索与这个特定用户有关的评级文件,这40个博客,如果在所有的用户评价他们,并通知他给了这些博客什么评级。

我试图提取一个特定用户的博客引用objectIds位于blogs[0]._idblogs[39]._id之间的所有评级文件,在我的情况下返回空列表。 可能是objectIds不能使用$lt$gt查询进行比较。 在那种情况下,我应该怎么做呢? 我应该重新devise我的模式,以适应这种情况?

我正在使用mongoosejs驱动程序来处理这种情况。 这里是代码的相关部分,执行有点不同,但你得到的想法。

架构:

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

楷模:

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

逻辑:

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

编辑:在实现下面的模式时,我不得不在mongoose.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" } ) 

如何在mongoose中执行此查询?

MongoDB(以及其他非关系数据存储)的一个好的做法是对数据build模,以便在应用程序中使用/查询。 就你而言,你可能会考虑对结构进行非规范化处理,并将评级存储在博客集合中,所以博客可能看起来像这样:

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

这个想法是rates数组中的对象包含了在单个文档中显示博客条目所需的所有数据,并附有评级。 如果您还需要以另一种方式查询费率(例如,查找用户X所做的所有评级),并且该站点是繁重的,那么您可以考虑将数据存储在Rates集合中,就像现在所做的一样。 当然,这些数据有两个地方,更新难度更大,但是在分析您的应用程序以及它如何访问您的数据之后,这可能是一个全面的胜利。

请注意,您可以将索引深入到文档结构中,例如,您可以索引News.rates.client_id ,然后您可以快速查找特定用户评级的News集合中的任何文档。