【问题标题】:Get results of request with sort and limit using pymongo使用 pymongo 获取带有排序和限制的请求结果
【发布时间】:2019-04-09 04:33:03
【问题描述】:

让我们使用这个简单的集合col 和 2 个文档:

{
    "_id" : ObjectId("5ca4bf475e7a8e4881ef9dd2"),
    "timestamp" : 1551736800,
    "score" : 10
}
{
    "_id" : ObjectId("5ca4bf475e7a8e4881ef9dd3"),
    "timestamp" : 1551737400,
    "score" : 12
}

为了访问最后一个时间戳(第二个文档的那个),我首先做了这个请求

a = db['col'].find({}).sort("_id", -1)

然后a[0]['timestamp']

但是由于这个集合中会有很多文档,我认为只请求具有限制功能的最后一个会更有效,比如

a = db['col'].find({}).sort("_id", -1).limit(1)

然后

for doc in a:
    lastTimestamp = doc['timestamp']

因为只有一个,我可以在循环中声明变量。

所以三个问题:

  • 如果我继续使用第一个请求并获取 dic 中的第一个元素,我是否需要担心内存/速度问题?
  • 在使用限制请求时,是否有更智能的方法来访问光标的第一个元素而不是使用循环?
  • 还有其他方法可以获取我不知道的时间戳吗?

谢谢! Python 3.6 / Pymongo 3.7

【问题讨论】:

    标签: python mongodb-query pymongo


    【解决方案1】:

    如果您在选择条件中使用具有唯一索引的任何字段,则应使用find_one 方法,该方法将返回与您的查询匹配的唯一文档。

    话虽如此,find 方法返回一个 Cursor 对象并且不会将数据加载到内存中。

    如果您使用过滤器选项,您可能会获得更好的性能。您现在的查询将执行集合扫描。

    如果您没有使用过滤器,并且想要检索最后一个文档,那么干净的方法是使用 Python 内置的 next 函数。您也可以使用next 方法。

    cur = db["col"].find().sort({"_id": -1}).limit(1):
    with cur:
        doc = next(cur, None) # None when we have empty collection.
    

    【讨论】:

    • 谢谢,我不知道过滤器,我会检查一下!
    • with 的意义何在?我们不能直接做doc = next(cur, None)
    • with在这里用来关闭光标@TmSmth
    【解决方案2】:

    find().sort() 这么快,不用担心速度,它是访问光标第一个元素的最佳选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 2023-01-02
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2020-08-14
      • 2021-06-08
      相关资源
      最近更新 更多