通过排序和分页填充或聚合2个集合

时间:2018-09-10 12:14:47

标签: mongodb express mongoose nosql

我最近刚用过猫鼬,对它的分类和分页有些困惑。

说我做一些像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?

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

1 个答案:

答案 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。