使用排序和分页填充或聚合 2 个集合
Posted
技术标签:
【中文标题】使用排序和分页填充或聚合 2 个集合【英文标题】:populate or aggregate 2 collection with sorting and pagination 【发布时间】:2019-02-14 21:00:40 【问题描述】:我最近才用猫鼬,有点困惑如何排序和分页。
假设我做了一些像 twitter 这样的项目,我有 3 个模式。第一个是用户,第二个是帖子,第三个是 post_detail。 user schema 包含用户拥有的数据,post 更像是我们可以回复的 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?
无论如何,谢谢,非常感谢帮助和指导 :))
【问题讨论】:
【参考方案1】:欢迎来到 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"
]
使用此架构并使用聚合框架,您可以按用户名对 cmets 进行排序。 如果您不喜欢这种方法,我宁愿选择您提到的 RDBMS。
【讨论】:
感谢您的快速响应先生。哦,所以我们可以将具有关系的 3 个文档加入到 1 个文档中。但是假设用户在一年中发表了超过 1000 条帖子,您认为仅更改 authorName 就可以更新 1000 条帖子吗?或者 mongodb 是否足够快且足以做到这一点? 欢迎您:)。即使您有重复的信息,我仍然会有 2 个集合,一个用于用户,另一个用于带有 cmets 的帖子。我认为1000个帖子还可以,mongo可以处理。另外,我发现更新 authorName 不是一个常见的操作(我认为用户不会每天都改变他的名字),也不是一个关键的操作。无论如何,如果您有正确的索引,我相信您不会花那么长时间更新 1000 条记录。最多可能 1-2 秒。 啊,我明白了.. 实际上我从未测试过它。但我认为更新 1000 个数据以更改 full_name 是无关紧要的。我想我需要从 rdbms 改变我的心态。谢谢先生,我会接受这个答案。谢谢你:)) 我认为改变心态是第一步 :) 如果您需要进一步的帮助,可以联系我。祝你有美好的一天!以上是关于使用排序和分页填充或聚合 2 个集合的主要内容,如果未能解决你的问题,请参考以下文章