【问题标题】:Checking position of an entry in an index MongoDB检查索引 MongoDB 中条目的位置
【发布时间】:2013-08-10 21:09:43
【问题描述】:

我有一个使用 pymongo 的查询,它根据以下内容输出一些值:

cursor = db.collect.find({"index_field":{"$regex":'\s'}}
for document in cursor:
  print document["_id"]

现在这个查询已经运行了很长时间(超过 5 亿个文档),正如我预期的那样。我想知道是否有一种方法可以通过找出最后打印的“_id”在索引字段中的位置来检查查询的执行位置。就像最后打印的 _id 是在 btree 索引的中间吗?快结束了吗?

我想知道这一点只是为了看看我是否应该取消查询并重新优化和/或让它完成,但我无法知道查询中 _id 的位置。

另外,如果有人有办法优化我的空白查询,那将很有帮助。根据文档,如果我使用 ignorecase 似乎会更快,尽管它对空格检查没有意义。

非常感谢, J

【问题讨论】:

  • 你的第一个问题我不清楚。关于优化,当您插入文档时,如果 index_field 有空格,请在文档中保留一个布尔值/标志,并在该标志/布尔值上创建一个稀疏索引。现在您的新查询将是 find({flag: true})find({flag: {$exists: true}})
  • 如果你有一个游标,并且你正在遍历它,是否可以找出游标中_id的位置。就这样。如果你看到了,我正在打印出 _id。所以我想获取那个_id,并找出它在光标对象中的位置。
  • 你不能这样做,因为光标文档是分批获取的。通常批量大小限制为某些大小或没有文档。因此,除非您从光标迭代(并收集)所有文档,否则不可能在光标内找到_id。你可以试试这个命令。 cursor = db.collect.find({"index_field":{"$regex":'\s'}}; cursor.count(); cursor.objsLeftInBatch();
  • 哦,这很有意义..查询结束了。感谢您的帮助,以后不要再说了
  • 1.它不起作用,正如我回答的那样,你需要另一个斜线来逃避。 2. 注意:cursor.count() 是一个缓慢的操作,所以最好避免它,如果可能

标签: mongodb indexing pymongo


【解决方案1】:

查询优化

您的查询无法进行优化,因为在文档中查找空间 \s 是一种效率低下的$regex 搜索。您可以做的是在$regex 中搜索\s 的前缀,例如

db.collect.find({"index_field": {"$regex": '^\\s'}})

Check out the notes in the link

索引问题

$regex只有在正则时才能有效地使用索引 表达式在字符串的开头(即 ^)有一个锚点,并且是 区分大小写的匹配。此外,虽然/^a//^a.*//^a.*$/ 匹配等价的字符串,他们有不同的表现 特征。所有这些表达式都使用索引,如果 存在适当的索引;但是,/^a.*//^a.*$/ 速度较慢。 /^a/匹配前缀后可以停止扫描。


数据库操作的信息

使用db.currentOp() 获取有关您所有running ops 的信息。

【讨论】:

  • 问题是,有时空格不会锚定开头或结尾。但它贯穿
  • @jwillis0720 试试我编辑的回复,如果您不需要使用索引,并且获取所有字段至少有一个空格很重要,那么您应该删除锚。
猜你喜欢
  • 2018-08-14
  • 2012-02-21
  • 2014-01-30
  • 2015-12-21
  • 2017-12-18
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多