【发布时间】: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()是一个缓慢的操作,所以最好避免它,如果可能。