簡體   English   中英

如何檢查pymongo游標是否有查詢結果

[英]How to check if a pymongo cursor has query results

我需要檢查find語句是否返回非空查詢。

我在做的是以下內容:

query = collection.find({"string": field})
if not query: #do something

然后我意識到我的if語句從未被執行,因為find返回一個游標,或者查詢是否為空。

因此我檢查了文檔 ,找到了兩種可以幫助我的方法:

  1. count(with_limit_and_skip=False)其中(來自說明):

    返回此查詢的結果集中的文檔數。

    這似乎是一個很好的檢查方法,但這意味着我需要計算光標中的所有結果,以確定它是否為零,對吧? 有點貴嗎?

  2. retrieved哪個(來自描述):

    到目前為止檢索的文件數量。

    我在一個空的查詢集上測試它並返回零,但它不清楚它做了什么,我不知道它是否適合我。

那么,檢查find()查詢是否返回空集的最佳方法(最佳實踐)是什么? 上面描述的方法之一是否適用於此目的? 性能怎么樣? 還有其他方法嗎?


需要明確的是:我需要知道查詢是否為空,我想找到關於性能和pythonic的光標的最佳方法。

編輯雖然在2014年這是真的,現代版本的pymongo和MongoDB已經改變了這種行為。 買家要小心:

.count()是查找查詢中返回的結果數的正確方法。 count()方法不會耗盡游標的迭代器,因此您可以在迭代結果集中的項之前安全地執行.count()檢查。

MongoDB 2.4中計數方法的性能得到了極大的提高。 唯一可能減慢count速度的是查詢是否設置了索引。 要查明您是否有查詢索引,您可以執行類似的操作

query = collection.find({"string": field})
print query.explain()

如果在結果中看到BasicCursor ,則需要在此string字段上為此查詢添加索引。


編輯 :正如@a​​lvapan指出的那樣, pymongo在pymongo 3.7+中棄用了這個方法,現在更喜歡在單獨的查詢中使用count_documents

item_count = collection.count_documents({"string": field})

計算查詢返回的項目數的正確方法是在迭代后檢查查詢中的.retreived計數器,或者首先enumerate查詢:

# Using .retrieved
query = collection.find({"string": field})
for item in query:
    print(item)

print('Located {0:,} item(s)'.format(query.retrieved))

或者,另一種方式:

# Using the built-in enumerate
query = collection.find({"string": field})
for index, item in enumerate(query):
    print(item)

print('Located {0:,} item(s)'.format(index+1))

如何使用find_one而不是find 然后你可以檢查你是否有結果或None 如果索引“string”,則可以傳遞fields = {"string":1, "_id" :0} ,從而使其成為僅索引查詢,甚至更快。

另一個解決方案是將光標轉換為列表,如果光標沒有任何數據則空列表其他列表包含所有數據。

 doc_list = collection.find({}); #find all data
 have_list = True if len(list(doc_list)) else False;

從我的測試來看,最快的方法是

if query.first():
    # do something

In [51]: %timeit query = MyMongoDoc.objects(); query.first()
100 loops, best of 3: 2.12 ms per loop

In [52]: %timeit query = MyMongoDoc.objects(); query.count()
100 loops, best of 3: 4.28 ms per loop

(使用MongoDB 2.6.7,2015-03-26)

暫無
暫無

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

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