1

我有一个发送到 MongoDB 的 python (3.2) 请求,并且请求本身运行得足够快。然后,当我执行 if 语句检查是否找到任何记录时,它需要 50 倍的时间:

    Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    58         27623      6475988    234.4      1.7          itemInDB = db.mainData.find({"x":item[x]}).limit(1)
    59                                           
    60                                                       #existing item in db
    61         27623    293419802  10622.3     77.6          if itemInDB.count():

if 语句花了这么长时间到底是什么原因?!我认为必须有更好的方法来检查是否找到了记录,但谷歌已经空了。

谢谢您的帮助。

4

2 回答 2

2

也许是更好的方式

如果您只对返回一个值感兴趣,您可能想要使用find_one而不是find. 找到一个值后它将停止寻找值,而不是必须find遍历集合:

itemInDB = db.mainData.find_one({"x":item[x]})
if itemInDB:
  print("Item found")
else:
  print("Item not found")

为您的示例

根据PyMongo 文档,在查询游标的计数时,您可以传入一个参数 (TrueFalse) 以考虑以前对游标进行的任何skip或调用。limit该参数的默认值是False(即,不考虑这些调用)。这可能会影响count查询的性能。

衡量查询性能

如果您想查看 mongo 将如何执行您的查询,您可以explain在光标上调用:

db.coll.find({"x":4}).explain()

解释函数也在PyMongo 中实现

于 2013-11-08T06:10:27.703 回答
0

原来这是由于 find() 函数而不是 if 语句。我在“x”上创建了一个索引(无论如何我都应该这样做)。将 find 更改为 find_one 并从 if 语句中删除了 .count() 。总体快 75%。

于 2013-11-08T13:52:22.787 回答