簡體   English   中英

使用pymongo獲取具有排序和限制的請求結果

[英]Get results of request with sort and limit using pymongo

讓我們以2個文檔作為這個簡單的集合col

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

要訪問上一個時間戳(第二個文檔中的一個),我首先執行了此請求

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

然后a[0]['timestamp']

但是由於此集合中將有很多文檔,我認為只請求帶有limit函數的最后一個文檔會更有效,例如

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

接着

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

因為只有一個,所以我可以在循環內聲明變量。

所以三個問題:

  • 如果我繼續使用第一個請求並獲得dic中的第一個元素,是否需要擔心內存/速度問題?
  • 使用限制請求時,是否有更聰明的方法來訪問游標的第一個元素而不是使用循環?
  • 還有另一種我不知道的時間戳獲取方式嗎?

謝謝 ! Python 3.6 / Pymongo 3.7

如果在選擇條件中使用具有唯一索引的任何字段,則應使用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.

find()。sort()是如此之快,不必擔心速度,它是訪問游標第一個元素的最佳途徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM