【发布时间】:2018-02-26 00:24:48
【问题描述】:
我是 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 将导致相同数据的复制,并且可以为数十万用户增长到数十亿。
【问题讨论】:
-
我仍然不清楚为什么第一个选项不可行。我同意 mongodb 不支持 join 进行在线查询。但是,使用此post,您可以将 join 用于离线进程。第一种选择如何破坏目的尚不清楚。你能详细说明一下吗?
-
MapReduce 技术返回一个 BSON 文档,它的大小可以是最大 16mb,所以我的帖子数量和每个帖子的共享数量可能会增加,并且可能会达到 16mb 大小的结果文档
-
好的。关于 map-reduce 用例,我同意你的看法。但是我仍然无法理解为什么第一个选项没有帮助。我的意思是,如果您能够定义您的 api 请求或用例,那就更清楚了。
-
@SIDDHARTHJMEHTA 获得的最终结果将包含一个文档,该文档将具有一个 shares 数组,并且每个数组都可以有许多文档,所以同样
-
@SIDDHARTHJMEHTA。我想收到用户关注者的帖子和分享(在两者中搜索 postedBy 和 shareBy 并根据 Date 排序)所以我需要也要查看这些并根据时间返回它们中的每一个
标签: mongodb mongodb-query aggregation-framework mongoose-schema nosql-aggregation