【问题标题】:Optimized way of Querying in MongoDB using $in vs $or使用 $in vs $or 在 MongoDB 中查询的优化方式
【发布时间】:2019-03-02 18:45:46
【问题描述】:

实现一个应用程序,从大约 10 个电子邮件 ID 的列表中查找邮件 ID 存在的表。尝试使用 $or 和 $in。

$in 似乎提供了更好的性能,但并不重要。一个比另一个优化吗?

【问题讨论】:

  • 对于初学者来说,$in 只需要一个索引,这很重要,因为 $or 需要更多(每个子句一个)。 $or 就像获取每个子句的结果,然后合并重复项并返回结果。所以这是这里要考虑的一个重点,而 $in 是一个范围标识符。根据计算机科学的规律,我会说如果你可以使用 $in 它会比 $or 更优化

标签: mongodb


【解决方案1】:

MongoDB 文档有 the answer:

“当使用 $or 和 对同一字段的值进行相等检查时,请选择 $in 运算符而不是 $or 运算符。”

【讨论】:

  • 好答案,但为什么docs 更喜欢$in 进行平等检查?
  • 总有一天它可能不会有什么不同,目前查询优化器会在两者之间选择一个稍微不同的计划,而当这是唯一的谓词时它没有任何区别在性能方面,当涉及其他谓词时,它可能会有所作为。加上将它写成 $in 使得它更容易阅读 - 很明显,同一个字段正在针对多个值进行测试。
【解决方案2】:

$or 运算符是逻辑运算符,您可以在其中定义自己的登录名,但 $in 运算符是 比较运算符,您可以在其中进行比较,但不能放在逻辑上。

$in的语法:

{ field: { $in: [<value1>, <value2>, ... <valueN> ] } }

例子:

db.account.find( { qty: { $in: [ 5, 15 ] } } )

$or的语法:

{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

例子:

db.account.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )

注意:帐户是您的收藏名称

【讨论】:

    【解决方案3】:

    "虽然 "$or" 将始终有效,但尽可能使用 "$in" 作为查询优化器 更有效地处理它。”

    此外,"$in" 具有更高的可读性。

    参考:MongoDB:权威指南

    【讨论】:

      【解决方案4】:

      好吧,如果您使用 $in,这将确保不会有任何不确定性,但是我更喜欢将其格式化为 $ 或因为它将确保索引(可读性不会让我担心在我更喜欢的应用程序逻辑中处理消耗app的内存而不是mongodb服务器)

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多