如何在生产代码中确保_index?

时间:2012-09-21 21:41:04

标签: python mongodb indexing tornado pymongo

如何在生产代码中添加索引?我只找到了将其添加为命令而未嵌入完整代码的方法:

如果要为速度查询添加索引:

db.users.ensure_index(the_key)

所以我尝试将它添加到一个类中:

class Registration(BaseHandler):
    def post(self):
        # do stuff to get user information using the self.get_argument()
        user={"all information":informations}
        self.db.users.insert(user, w=1)
        self.db.users.ensure_index(pseudo, commune)

但我得到这样的错误:

self.db.users.ensure_index(pseudo, commune)
      File "build\bdist.win-amd64\egg\pymongo\collection.py", line 829, in ensure_index
      return self.create_index(key_or_list, cache_for, **kwargs)
  File "build\bdist.win-amd64\egg\pymongo\collection.py", line 740, in create_index
    self.__name, name, cache_for)
  File "build\bdist.win-amd64\egg\pymongo\connection.py", line 330, in _cache_index
    expire = datetime.timedelta(seconds=cache_for) + now
TypeError: unsupported type for timedelta seconds component: unicode

我想在使用插入子文档时它将是相同的提示:

self.db.users.update({"email":email}, {"$push":{"produit_up":{"id":id, "namep":namep, "nombre":nombre}}})
self.db.users.ensure_index("product_up.namep") #????

2 个答案:

答案 0 :(得分:2)

您的错误是将非整数作为cache_for传递的结果,它告诉pymongo缓存索引存在的事实需要多长时间。

我不知道代码中的psuedocommune是什么,但ensure_indexpymongo的正确用法是ensure_index(key_or_list, cache_for=300, **kwargs)。您可以在pymongo documentation中详细了解这一点,但要点是key_or_list是一个命名键的字符串(是的,这可以包括您显示的子文档)或列表包含(键,方向)对的元组,其方向为pymongo.ASCENDINGpymongo.DESCENDING

答案 1 :(得分:-1)

得到了答案:

  

否否,ensureIndex与创建索引相同。它什么都不做   特别的,也许功能的名称真的有点奇怪   改为称为create_index。   由于Mongo没有预定义的模式(NoSQL),因此必须创建索引a   不同的SQL方式。建议的方式是通过客户端时   用户决定他们需要特定字段的索引。这是怎么回事   集合和客户使用它们时未创建的集合。   这个函数叫做ensureIndex()。   因此,在您的应用程序中只需要一次调用EnsureIndex()即可   应该是该索引的字段列表作为第一个参数和任何额外的   第二个参数的选项(如稀疏)。   管理员无需保持此索引的完整性,   不是一个月一次,但如果集群中出现问题,那么是的,有些   管理员可能需要工作才能重新制作索引。   我个人有一个索引文件,我每次加载我的应用程序时都会调用它们。   我希望这可以解决一些问题,

来自Google groups

的回答