【问题标题】:Should i care about filtering $nin ids from $in ids before querying mongodb?在查询 mongodb 之前,我应该关心从 $in ids 中过滤 $nin ids 吗?
【发布时间】:2015-01-04 17:47:36
【问题描述】:

所以我有一些 node.js 代码,其中有一个用于 mongodb 的 $in 和 $nin id。

“$nin”列表实际上比“$in”列表大。

在“我的实现”中,我通过将两个 ids 列表传递给 mongodb 以“简单的方式”做到了:

query = { _id: { $in: in_list, $nin: not_in_list } }

然后我的同事来了,从“$in”列表中删除了所有“$nin”的id,只查询了$in

in_list = _.difference in_list, not_in_list query = { _id: { $in: in_list } }

我的假设是,mongodb 足够聪明,可以比 node.js 更有效地处理这个问题,但我实际上不知道这种差异是否真的可测量和/或显着。

有什么意见吗?

【问题讨论】:

  • 为什么不测试这两种方法并比较性能?
  • 我希望在基准测试方面有良好经验的人可以用一种很好的基准测试方法来启发我们。目前我只能像每个人一样运行 1000 倍并进行比较,但我怀疑这不是“正确的方式”!?
  • 这基本上可以归结为哪个更适合为您处理数字。通过线路发送所有结果,以供查询优化器提取列表中的差异或在客户端中计算出差异。这可能与列表的大小有关。你如何将你的发现作为你的答案。其他人可能会发现它很有用。顺便说一句,您的评论回复来自可以说是这里经验最丰富的两个人。
  • 我没有考虑网络延迟/成本(如此明显!!)该应用程序将运行多年,对于活跃用户来说,这个列表将变得相当大。我相信在“代码”上处理它们(与 mongo 相反)将是正确的,因为我们对这个集群进行了自动缩放,而 mongodb 只有少量固定的实例。

标签: node.js mongodb benchmarking


【解决方案1】:

是的,$in 会更快。任一查询都需要扫描结果集中的每个文档,因此,如果您完成 $in 查询所需的项目数量少于 $nin 查询,请使用它。

【讨论】:

  • 这不是它的工作原理。优化器将以与建议的客户端操作类似的方式否定列表。她归结为的唯一问题是将所有这些通过网络发送到服务器来执行此操作或允许可能功率较小的客户端处理代码的成本更高。一般怀疑是网络成本大于客户端处理速度较慢。但这不会像您建议的那样“交叉”两个结果集。
  • 啊,这很有趣。不知道优化器会这样做,但这是有道理的。感谢您的提示。
猜你喜欢
  • 2019-07-10
  • 1970-01-01
  • 2017-02-26
  • 2017-11-22
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多