我最近刚用过猫鼬,对它的分类和分页有些困惑。
说我做一些像twitter的项目,我有3个架构。第一是用户,第二是用户,第三是post_detail。用户架构包含用户拥有的数据,帖子更像是fb status或可以回复它的Twitter tweet,post_detail就像帖子的回复
用户
var userSchema = mongoose.Schema({
username: {
type: String
},
full_name: {
type: String
},
age: {
type: Number
}
});
发布
var postDetailSchema = mongoose.Schema({
message: {
type: String
},
created_by: {
type: String
}
total_reply: {
type: Number
}
});
post_detail
var postDetailSchema = mongoose.Schema({
post_id: {
type: String
}
message: {
type: String
},
created_by: {
type: String
}
});
该关系为user._id = post.created_by,user._id = post_detail.created_by,post_detail.post_id = post._id
假设用户A发表1个帖子,其他1000个用户对此帖子发表评论,我们如何按用户的用户名对评论进行排序?用户可以更改数据(在这种情况下为全名,年龄),所以我不能将数据放在post_detail上,因为数据可以动态更改,或者我只是将其放在post_detail上,如果用户更改数据,我也要更改post_detail吗?但是如果这样做,我需要更改许多行,因为如果同一用户评论100条帖子,那么该数据也需要更改。
问题在于如何对其进行排序,我想如果可以对其进行排序,我也可以对其进行分页。还是在这种情况下,我应该只使用rdbms而不是nosql?
无论如何,非常感谢您的帮助和指导:))
答案 0 :(得分:0)
欢迎使用MongoDB。 如果您想按照自己的描述去做,那就不要去Mongo。 您正在基于关系而不是在文档中设计架构。 您的设计需要进行连接,而在mongo中这种方法效果不佳,因为没有一种简单/快速的方法。
首先,我不会为帖子详细信息创建单独的实体,而是将帖子详细信息作为列表嵌入到帖子文档中。
关于您的问题:
或者我只是将其放在post_detail上,如果用户更改数据,我只是 还要更改post_detail吗?
是的,那是你应该做的。如果您希望能够按用户名对文档进行排序,则应将其规范化并包含在post_details中。 如果我必须设计模式,它将是这样的:
{
"message": "blabl",
"authorId" : "userId12",
"total_reply" : 100,
"replies" : [
{
"message" : "okk",
"authorId" : "66234",
"authorName" : "Alberto Rodriguez"
},
{
"message" : "test",
"authorId" : "1231",
"authorName" : "Fina Lopez"
}
]
}
使用此架构和聚合框架,您可以按用户名对注释进行排序。 如果您不喜欢这种方法,我宁愿选择您所提到的RDBMS。