【问题标题】:limit on each clause of logical-OR - mongo and equivalent sql限制逻辑或的每个子句 - mongo 和等效 sql
【发布时间】:2021-11-14 15:52:42
【问题描述】:

XY:我正在尝试优化我们系统中的一组频繁查询,它从包含每个uid 的许多文档(记录)的大型集合(表)中查找"at most one record matching each uid"。具体来说,该集合是 v5.0 之前的时间序列(我需要应用 both limitsort),但据我所知,答案将适用给两个运营商。如果需要,请随时更正此问题。

我正在探索这一点,因为即使在 uid 上有索引,这些(当前单独的)查询中的每一个都必须产生大量重复开销,并且有许多 uids 需要查询 - HTTP api 调用往返,打开索引文件并找到给定uid 的第一个条目。即使考虑到在评估每个 $or 时必须保持的“状态”,引擎似乎也可以比多个查询优化得更好。

说我有:

{ uid: "1000", value: "001" }
{ uid: "1001", value: "101" }
{ uid: "1002", value: "201" }
{ uid: "1000", value: "002" }
{ uid: "1000", value: "003" }
{ uid: "1001", value: "102" }

[{ uid: "1000", value: "001"}, {uid: "1001", value: "101"}]

将由看起来像这样的查询返回(此处使用 limit 无效;因此我的问题):

mycollection.find({ $or [ {uid: "1000", $limit: 1}, {uid: "1001", $limit: 1} ] })
                                          ^^^                       ^^^

这在 Mongo 中是否可行,还是我需要运行两个单独的查询?

所以我可以更好地理解这里相关的数据库术语,我希望任何答案也能反映 ~standard sql - 这在sql 中是否也可能,如果是的话,什么是等价的查询

【问题讨论】:

  • 注意:这里的简化示例肯定最好通过缓存来解决,我们打算针对“最新”查询(例如简单地 {$sort:-1} on timestamp) - 但其他类似使用涉及偏移到数据中,它不能使用该优化。无论如何,我真的很想了解这里有什么可能或有帮助。

标签: sql database mongodb


【解决方案1】:

幸运的是,您可以在 $or 子句中使用 findOne()
我想这就是你要找的:

db.collection.find({ $or :[ db.collection.findOne({uid:"1000"}), db.collection.findOne({uid: "1001"}) ] })

【讨论】:

  • 我假设在后台这是异步的,足以让数据库一次“看到”所有查询?还是首先评估findOne(索引扫描)?另外,有没有办法做一个~limit > 1?
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2017-11-07
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多