【问题标题】:What is the most efficient way to get a value by ObjectId in MongoDB using pymongo?使用 pymongo 在 MongoDB 中通过 ObjectId 获取值的最有效方法是什么?
【发布时间】:2012-06-13 22:30:43
【问题描述】:
db.test.find_one(ObjectId('4f3dd96d1453373bcb000000'))

或者完全是别的什么?我知道 _id 列是自动索引的,我希望利用这种效率。

谢谢!

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    是的,你的方法是正确的。

    既然您询问的是效率,请记住,当您优化读取操作以提高性能时,您可能只想读取您需要的属性。如果您的文档的某些属性很大,那么这可以显着降低 IO 成本(将数据从服务器传输到客户端)。例如,如果您的文档有 20 个属性,但您只使用了其中的 5 个,那么不要将其他 15 个拉到线上。在 pymongo 中,您可以使用 collection.find 函数的可选 fields 参数来执行此操作。显然,您需要在这里平衡性能与代码可维护性,因为列出属性会增加维护成本。

    the official docs 提供更多优化建议。他们的列表包括“优化#3:仅选择相关字段”,这正是我上面所说的。

    【讨论】:

    • 您能稍微解释一下这一点——拉取人们关心的支持属性吗?
    • 已说明。这会使您的代码更加冗长,所以如果您只是要在这里和那里保存几个字节,请不要打扰。但是,如果您有非常大的属性,有时您不需要它们,那么节省的费用可能会加起来。取决于您的数据和应用程序的性能要求。
    • 谢谢;就 mongodb 使用的内存量而言,这些收益是多少?
    • 不,mongodb 已经在内存中拥有所有属性。我的意思是指出,由于发送服务器到客户端的字节更少,网络开销会更低。另外,你说得对,python 客户端/脚本会使用更少的内存。
    【解决方案2】:

    如果您通过 _id 获得特定的值,那么我会说是的,这是最有效的方法。

    根据您的数据,索引该值并对其进行搜索可能会更有效。

    【讨论】:

      【解决方案3】:

      如果您知道 _id,那么您应该只以这种方式调用。 db.test.find_one(ObjectId('4f3dd96d1453373bcb000000'))
      你在pymongo中的完整代码可能是这样的

      connection=Connection(self.host ) #%(self.user_name,self.password))
          #connection1=Connection(host=self.host, port=self.port)
          db=connection[self.db_name]
          db.authenticate(self.user_name, self.password)
          collection=db[self.question_collection]
          obj_id= ObjectId(_id)
          info=collection.find_one(obj_id)
      

      【讨论】:

        猜你喜欢
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        相关资源
        最近更新 更多