我有一个博客文章服务器,它将包含数百万篇文章,我需要能够获取用户A撰写的所有文章。
什么是最好的模式设计。
1( 将用户和文章文档分开,并让用户 A 文章在所有百万条记录中搜索用户 ID
articles.find({Writer_id: User_A.id})
2( 在用户架构中放置文章 ID 引用。前任:
userSchema = {
name: "name",
age: "age",
articles: [ {type:mongoose.Article_id}, {type:mongoose.Article_id} ]
}
并搜索用户 A 并进行联接以取回文章。
最好保持Writer_id
方法并在该属性上创建索引。如果存储引用数组,则需要对find()
调用执行$in
操作。这将导致您的查询从一个匹配Article_id
"跳"到另一个匹配。相反,如果您有一个Writer_id
和一个为该属性构建的索引,则用户的所有文章都将存在于索引中的同一顺序"块"中,不需要跳转。结果是读取效率更高的find()
操作。
此外,文章数组方法需要频繁更新用户文档,而Writer_id
方法只需要插入。插入非常高效,而频繁更新的效率相对较低。最后,Article_id
数组可能会(如果不太可能(导致达到 16 MB 的文档大小限制。Writer_id
方法没有这种限制。
对于较小的项目来说,差异应该相对可以忽略不计,但是如果您正在寻找可扩展性,那么最好采用Writer_id
方法。