我是mongodb NoSQL 概念的新手,并且我无法决定是否可以最好地为我的目的建立架构。
我需要设计架构,使得我的最终结果为按时间排序的帖子和份额。为此我考虑了两个选择:
选项1:不同的帖子和分享集合:
收集后的架构:
var postSchema = mongoose.Schema({
postText: String,
postedBy: String,
privacy: Number,
updatedOn: { type: Date, default: Date.now }
}, { collection: 'posts' });
分享收藏架构
var shareSchema = mongoose.Schema({
dis_Id: { type: mongoose.Schema.Types.ObjectId }, // Id of post that is shared
shareBy: { type: mongoose.Schema.Types.ObjectId },
shareText: String,
share_privacy: Number,
shareOn: { type: Date, default: Date.now }
}, { collection: 'shares' });
选项2:在帖子中嵌入分享
发布的新架构
var postSchema = mongoose.Schema({
postText: String,
postedBy: String,
updatedOn: { type: Date, default: Date.now },
privacy: Number,
share: {
shareBy: { type: mongoose.Schema.Types.ObjectId },
shareText: String,
share_privacy: Number,
shareOn: { type: Date }
}
}, { collection: 'posts' });
现在哪一个可能是更好的选择?选项1在查询时遇到问题,因为mongodb中没有连接,选项2将导致复制相同的数据,并且可以为数十万用户增长到数十亿以上。
答案 0 :(得分:0)
确定。我建议采用以下方法:
由于您已拥有用户名,因此您可以使用sort按排序顺序检索与该ID对应的帖子列表。
对每个帖子进行迭代,您可以使用上面使用的相同排序按排序顺序获取共享。
这里的关键是理解你要设置的索引。我建议你应该有以下索引。
post_schema: {username,updatedOn}上的复合索引
share_schema: {dis_Id,shareOn}上的复合索引。
如果未使用复合索引,则您的应用程序将无法扩展到大量记录。
答案 1 :(得分:0)
当你将所有必需的数据放在一起时,很容易使用嵌入式文档,因此选项2在这种情况下是好的。但是,如果您担心文档的大小增加超过16MB,那么请选择1.在这种情况下,不要使用聚合查询来连接两个集合,因为这将是耗时的操作,因为它将首先执行所有操作然后执行跳过操作。相反,您应该单独查询每个集合,并使用一些自定义逻辑自行创建完整的响应。