【问题标题】:Modelling blogs and ratings in mongodb and nodejs在 mongodb 和 nodejs 中建模博客和评级
【发布时间】:2012-05-25 18:04:10
【问题描述】:

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

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

我试图提取特定用户的所有评级文档,其中博客引用 objectIds 位于 blogs[0]._idblogs[39]._id 之间,在我的情况下返回空列表。可能无法使用 $lt$gt 查询比较 objectIds。在那种情况下我应该怎么做呢?我应该重新设计我的架构以适应这种情况吗?

我在这种情况下使用 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" } )

如何在猫鼬中进行此查询?

【问题讨论】:

    标签: javascript node.js mongodb mongoose nosql


    【解决方案1】:

    使用 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像你现在做的那样收集。当然,数据在两个地方,而且更新起来比较困难,但在您分析您的应用以及它如何访问您的数据之后,这可能是一个整体的胜利。

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

    【讨论】:

    • 好的。正如你所说,我改变了我的模式,但我仍然对如何获得用户对给定博客集的评分有疑问。关于具体的api,你能帮我吗? @布兰登
    • 如果一个项目有数百万的费率怎么办?这种模式有问题吗?
    • 文档中的嵌入率不好。如果您像@Burak 提到的那样有数百万个费率怎么办,如果有人需要更改他的评级怎么办?太复杂了
    猜你喜欢
    • 2019-04-27
    • 2013-04-16
    • 1970-01-01
    • 2013-01-08
    • 2017-10-04
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多