哪种MongoDB方法更适合代码可读性和可伸缩性?

时间:2016-03-07 15:00:49

标签: mongodb mongoose nosql

我有一个名为User的MongoDB文档,其中包含以下模型:

var User = mongoose.schema({
   _id: ObjectId,
   name: String,
   age: Number,
   blog_posts: [ObjectID]
});

以及名为BlogPost的文档,其中包含以下模型:

var BlogPost = mongoose.schema({
   _id: ObjectId,
   title: String,
   author: ObjectId,
   content: String,
   date: Date
});

现在可以说这可以扩展到50,000多个用户和500,000多个博客帖子。如果我想找一个用户的博客文章,这将是一个更好的方法(在性能和代码可读性方面):

Approach 1:
搜索所有BlogPost以查找匹配的作者= ObjectId。

Approach 2:
仅搜索BlogPost,其ObjectId与User blog_posts数组中的ObjectId匹配。

似乎两种方法都需要搜索BlogPost的所有100,000多条记录。在User blog_posts数组中存储ObjectId有什么好处?

1 个答案:

答案 0 :(得分:0)

我对mongodb的经验是“避免”数组,如果你可以做两件事:

  • Mongodb存储引擎不喜欢快速增长的阵列,特别是MMAPv1。
  • 很难在阵列上运行查询,特别是在嵌套数组上。

在这种情况下,您可以完全忘记user.brog_posts,因此请使用方法1。 在BlogPost.author上运行查询会更快更容易,因为您不必使用聚合框架,并且可以在单个对象上更高效地使用索引,然后在阵列上使用索引。

总而言之,如果您使用方法1,它将更快,更难以使用。