使用排序和分页填充或聚合 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"
    
    ]

使用此架构并使用聚合框架,您可以按用户名对 cme​​ts 进行排序。 如果您不喜欢这种方法,我宁愿选择您提到的 RDBMS。

【讨论】:

感谢您的快速响应先生。哦,所以我们可以将具有关系的 3 个文档加入到 1 个文档中。但是假设用户在一年中发表了超过 1000 条帖子,您认为仅更改 authorName 就可以更新 1000 条帖子吗?或者 mongodb 是否足够快且足以做到这一点? 欢迎您:)。即使您有重复的信息,我仍然会有 2 个集合,一个用于用户,另一个用于带有 cmets 的帖子。我认为1000个帖子还可以,mongo可以处理。另外,我发现更新 authorName 不是一个常见的操作(我认为用户不会每天都改变他的名字),也不是一个关键的操作。无论如何,如果您有正确的索引,我相信您不会花那么长时间更新 1000 条记录。最多可能 1-2 秒。 啊,我明白了.. 实际上我从未测试过它。但我认为更新 1000 个数据以更改 full_name 是无关紧要的。我想我需要从 rdbms 改变我的心态。谢谢先生,我会接受这个答案。谢谢你:)) 我认为改变心态是第一步 :) 如果您需要进一步的帮助,可以联系我。祝你有美好的一天!

以上是关于使用排序和分页填充或聚合 2 个集合的主要内容,如果未能解决你的问题,请参考以下文章

在集合视图和分页详细视图之间转换的正确方法

谷歌应用引擎和分页

如何对分布式数据进行排序和分页?

具有自己数据库的微服务的聚集,排序,过滤和分页

使用 nosql 排名的 SQLalchemy 中的排序和分页

javascript 聚合结果计数和分页