【问题标题】:populate or aggregate 2 collection with sorting and pagination使用排序和分页填充或聚合 2 个集合
【发布时间】: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?

无论如何,谢谢,非常感谢帮助和指导 :))

【问题讨论】:

    标签: mongodb express mongoose 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 改变我的心态。谢谢先生,我会接受这个答案。谢谢你:))
    • 我认为改变心态是第一步 :) 如果您需要进一步的帮助,可以联系我。祝你有美好的一天!
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2021-10-22
    • 2015-09-18
    相关资源
    最近更新 更多