Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在mongodb和nodejs中建模博客和评级_Javascript_Node.js_Mongodb_Mongoose_Nosql - Fatal编程技术网

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

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]之间。在我的例子中,它

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

当某个特定用户以“最新优先”的顺序浏览博客时(比如每页40个。称他们为
博客[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提到的数百万的费率,如果有人需要更改他的费率怎么办?太复杂