这是查询MongoDB的最佳结构吗?

时间:2016-03-04 00:08:34

标签: javascript mongodb mongoose nosql

我试图找到哪种方法更具可扩展性。 我有一个用户在拼车旅行中请求过座位,并且用户需要能够看到适用于他们的所有旅行。我的模型看起来像这样:

var UserSchema = new mongoose.Schema({
   id: String,
   name: String,
   trips: [String]            // An array of strings, which holds the id of trips
});

var TripSchema = new mongoose.Schema({
   id: String,
   description: String,
   passengers: [String]       // An array of strings, which holds the id of users
});

因此,当用户去查看适用于他们的所有行程时,我的后端将搜索Mongo数据库中的所有行程。 我决定采用两种方法:

  1. 搜索所有行程并返回用户ID在乘客阵列中的行程
  2. 搜索所有行程并返回ID与用户行程数组中的ID匹配的行程。
  3. 我认为方法#2更好,因为它不必在Trip模型中进行更深入的搜索。我只是在寻求确认,并想知道是否还有其他我应该考虑的事情。

1 个答案:

答案 0 :(得分:1)

如果你不做大数据,我只想说它没关系 - 两者都足够好,但如果你真的有数以百万计的用户和旅行的数百万查询......

  • 对于选项1,您只有一个查询,但您必须确保已将您的字段passengers编入索引,因此您需要维护另一个索引以使其高效。另一个索引会影响您的写入性能。
  • 对于选项2,您始终需要进行两次查询。 首先查询用户集合中的用户对象,然后执行in样式查询以加载与user.trips中任何tripIds匹配的行程项。您将在_id字段上查询,该字段始终为索引。当然,无论如何,当你总是加载你的用户时,只有一个真正重要的查询。

您还必须考虑writeread表现是否更重要。您的模型对于write来说效率非常低,因为每次新行程都需要更新两个集合(行程和用户)。因此,目前您的写入量翻倍,通常写入比读取更昂贵。

最后:拥有简单且可维护的代码大多比一点性能更重要 - >只需使用mongoose populate功能,所有内容都会自动完成。不要将引用存储为字符串,而是将其作为ObjectId类型存储,并在模型中使用ref keywoard。