Kam*_*ddy 6 javascript mongoose mongodb nosql node.js
我有一个博客集合,其中包含用户给予他们的title,body和agrregate评级.另一个集合'评级',其模式引用了博客,用户评价(如果他们评价他们)的形式是他们的ObjectIds和他们给出的评级,即.,+ 1或-1.
当特定用户浏览的"最新第一"为了部落格(说他们每页的40.打电话给他们的阵列blogs[0]来blogs[39])我有,以检索与该特定用户的评价文件和那些40个博客如果在所有用户给他们评分并通知他他给这些博客的评分.
我试图提取特定用户的所有评级文档,其中博客参考objectIds位于其间blogs[0]._id,blogs[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}
});
Run Code Online (Sandbox Code Playgroud)
楷模:
var newsm=mongoose.model('News', News);
var clientm=mongoose.model('Client', Client);
var ratesm=mongoose.model('Rates', Rates);
Run Code Online (Sandbox Code Playgroud)
逻辑:
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){
})
})
Run Code Online (Sandbox Code Playgroud)
编辑:在实现下面的架构时,我不得不在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" } )
Run Code Online (Sandbox Code Playgroud)
如何在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 }
]
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,数组中的对象rates包含在单个文档中显示博客条目所需的所有数据(包括评级)。如果您还需要以其他方式查询评级(例如查找用户 X 所做的所有评级),并且该网站的阅读量很大,您可以考虑像现在一样将数据存储在集合中。Rates当然,数据位于两个地方,并且更新起来比较困难,但在分析应用程序及其访问数据的方式后,这可能是一个整体胜利。
请注意,您可以将索引深入到文档的结构中,例如您可以索引News.rates.client_id,然后您可以快速找到集合中News特定用户已评分的任何文档。
| 归档时间: |
|
| 查看次数: |
1741 次 |
| 最近记录: |