【问题标题】:Is this an optimal structure for querying MongoDB?这是查询 MongoDB 的最佳结构吗?
【发布时间】:2016-06-17 13:42:38
【问题描述】:

我正在尝试找出哪种方法更具可扩展性。 我有一个用户在拼车旅行中申请了座位,并且该用户需要能够查看适用于他们的所有旅行。我的模型如下所示:

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 匹配的行程。

我认为方法 #2 更好,因为它不必在 Trip 模型中进行更深入的搜索。我只是在寻求确认,想知道是否还有其他需要考虑的事情。

【问题讨论】:

    标签: javascript mongodb mongoose nosql


    【解决方案1】:

    如果你不做大数据,我会简单地说没关系——两者都足够好,但如果你真的有数百万用户和旅行的数百万查询......

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

    您还必须考虑是write 还是read 性能更重要。对于write,您的模型效率很低,因为对于每次新行程,您都需要更新两个集合(行程和用户)。因此,目前您将写入翻倍,并且通常写入比读取更昂贵。

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

    【讨论】:

    • 太棒了,这正是我所希望的洞察力!在我的范围内,我更喜欢写入性能而不是微不足道的读取改进。我没有使用猫鼬填充功能,但我肯定会研究它。谢谢雷托! :)
    • 顺便说一句。也许对您来说是一本好书 - 这是有史以来最著名的计算机科学家之一:c2.com/cgi/wiki?PrematureOptimization
    • “过早的优化是万恶之源”哈哈,这将是一本好书
    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2010-10-13
    • 2021-11-16
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多