首页 文章

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

提问于
浏览
6

我有一个博客集合,其中包含用户给予他们的title,body和agrregate评级 . 另一个集合'评级',其模式引用了博客,用户评价(如果他们评价他们)它的ObjectIds形式和他们给出的评级,即 . ,1或-1 .

当一个特定的用户浏览'latest first'顺序中的博客时(比如说每页40个 . 请将它们称为 blogs[0]blogs[39] 的数组)我必须检索与该特定用户相关的评级文档以及那些40个博客(如果所有用户都评价的话)他们并告诉他他给这些博客的评分 .

我试图提取特定用户的所有评级文档,其中博客参考objectId位于 blogs[0]._idblogs[39]._id 之间,在我的情况下返回空列表 . 可能是objectIds无法使用 $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中执行此查询?

1 回答

  • 4

    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 集合中特定用户已评级的任何文档 .

相关问题