Javascript 在mongodb和nodejs中建模博客和评级
我有一个博客集合,包含标题、主体和用户给他们的评分。另一个集合“评级”,其模式参考了博客、以ObjectID和他们给出的评级(即+1或-1)形式对其进行评级(如果他对其进行评级)的用户 当某个特定用户以“最新优先”的顺序浏览博客时(比如每页40个。称他们为Javascript 在mongodb和nodejs中建模博客和评级,javascript,node.js,mongodb,mongoose,nosql,Javascript,Node.js,Mongodb,Mongoose,Nosql,我有一个博客集合,包含标题、主体和用户给他们的评分。另一个集合“评级”,其模式参考了博客、以ObjectID和他们给出的评级(即+1或-1)形式对其进行评级(如果他对其进行评级)的用户 当某个特定用户以“最新优先”的顺序浏览博客时(比如每页40个。称他们为博客[0]到博客[39])我必须检索与这个特定用户和那40个博客相关的评级文档,如果用户对它们进行了评级,并通知他对这些博客的评级 我试图提取特定用户的所有评级文档,其中博客引用objectid位于博客[0]和博客[39]之间。在我的例子中,它
博客[0]
到博客[39]
)我必须检索与这个特定用户和那40个博客相关的评级文档,如果用户对它们进行了评级,并通知他对这些博客的评级
我试图提取特定用户的所有评级文档,其中博客引用objectid位于博客[0]和博客[39]之间。在我的例子中,它返回空列表。可能是无法使用$lt
和$gt
查询进行比较的对象。那样的话,我该怎么办呢?我是否应该重新设计模式以适应此场景
我正在使用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(和其他非关系型数据存储)的一个好做法是对数据建模,以便在应用程序中易于使用/查询。在你的情况下,你可能会考虑对该结构进行非结构化处理,并将评级存储在博客集合中,因此博客可能看起来像这样:
{
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.client\u id
编制索引,然后您可以在新闻
集合中快速找到特定用户评级的任何文档。确定。正如你所说,我改变了我的模式,但我仍然有问题,如何获得用户对给定博客集的评分。你能帮我了解一下具体的api吗@布兰登如果一件商品有数百万的价格怎么办?这种模式有问题吗?文档中的嵌入率不好。如果你有@Burak提到的数百万的费率,如果有人需要更改他的费率怎么办?太复杂