【问题标题】:How do I make my MongoDB query more efficient?如何让我的 MongoDB 查询更高效?
【发布时间】:2011-06-29 07:11:09
【问题描述】:

现在,我正在执行 2 个步骤。我想消灭其中一个。

//Get total results, before the limit. I need this number for pagination reasons.
total_rooms = db.rooms.find({'name':'big'}).count();

//Get the actual results
rooms = db.rooms.find({'name':'big'}).skip(start).limit(num)

我在我的网站上到处都在做双重查询,我觉得很傻。 Mysql 只要求我做一个查询,并给我total_results。

【问题讨论】:

  • 如果您想要页数,您无法消除任何这些查询。即使您可以以某种方式组合它 - 数据库仍将在内部执行相同数量的操作。
  • 谢谢keymone。第一个查询是否非常密集? (更好的问题:与第二个查询相比,它的强度如何)?
  • 别担心。只要速度快,发出多个查询就可以了。确保你有一个关于“名字”的索引。您可以通过从分页切换到“显示更多”的 twitter 样式列表来消除获取计数的需要。

标签: mongodb indexing database


【解决方案1】:

您只需要一个查询。在 shell 中试试这个:

for(var i = 0; i < 1000; i++) db.test.save({a:i})
cursor = db.test.find().skip(10).limit(10)

现在,您可以获得总的结果集大小:

cursor.count()
1000

结果集大小考虑了跳过和限制:

cursor.count(true)
10

请注意,服务器将完成确定这两个数字所需的所有工作,如果服务器上的可用数据多于第一个结果返回的数据,则会发出新的计数查询。换句话说,更简洁的代码但并不总是更高的性能。

【讨论】:

  • 那么,执行这两个查询的性能是一样的吗?
  • 它总是比两个查询快或快。确切的性能取决于服务器是发送所有结果数据还是仅发送第一批。在后一种情况下 cursor.count() 将需要一个额外的命令发送到服务器。
  • 我正在使用这种方法。多谢。哦,最后一件事——如果我有“排序”以及跳过和限制(在光标中)......这不会影响运行 count()......对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 2011-06-14
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2018-05-17
  • 2016-03-01
相关资源
最近更新 更多