在 mongodb 和 nodejs 中对博客和评级进行建模

2024-05-16

我有一个博客集合,其中包含用户给予的标题、正文和综合评分。另一个集合“评级”,其架构引用了博客、以对象 ID 的形式对博客进行评级(如果有的话)的用户以及他们给出的评级,即 +1 或 -1。

当特定用户按照“最新优先”的顺序浏览博客时(比如每页 40 个博客。将它们称为数组)blogs[0] to blogs[39])我必须检索与该特定用户和这 40 个博客相关的评级文档(如果用户对这些博客进行了评级),并通知他对这些博客的评级。

我尝试提取特定用户的所有评级文档,其中博客引用 objectIds 位于blogs[0]._id and blogs[39]._id在我的例子中返回空列表。可能无法使用 objectId 进行比较$lt and $gt查询。那这种情况我该怎么办呢?我应该重新设计我的模式以适应这种情况吗?

我在这种情况下使用 mongoose js 驱动程序。以下是代码的相关部分,它们在执行中略有不同,但您已经明白了。

Schemas:

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

models:

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

编辑: 在实现下面所说的模式时,我必须在 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" } )

我如何在猫鼬中执行此查询?


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 的所有评分),并且该网站的阅读量很大,您可以考虑also将数据存储在Rates就像你现在所做的那样收集。当然,数据位于两个地方,并且更新起来比较困难,但在分析应用程序及其访问数据的方式后,这可能是一个整体胜利。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 mongodb 和 nodejs 中对博客和评级进行建模 的相关文章

随机推荐