[英]How to check if a pymongo cursor has query results
我需要檢查find
語句是否返回非空查詢。
我在做的是以下內容:
query = collection.find({"string": field})
if not query: #do something
然后我意識到我的if
語句從未被執行,因為find
返回一個游標,或者查詢是否為空。
因此我檢查了文檔 ,找到了兩種可以幫助我的方法:
count(with_limit_and_skip=False)
其中(來自說明):
返回此查詢的結果集中的文檔數。
這似乎是一個很好的檢查方法,但這意味着我需要計算光標中的所有結果,以確定它是否為零,對吧? 有點貴嗎?
retrieved
哪個(來自描述):
到目前為止檢索的文件數量。
我在一個空的查詢集上測試它並返回零,但它不清楚它做了什么,我不知道它是否適合我。
那么,檢查find()
查詢是否返回空集的最佳方法(最佳實踐)是什么? 上面描述的方法之一是否適用於此目的? 性能怎么樣? 還有其他方法嗎?
需要明確的是:我需要知道查詢是否為空,我想找到關於性能和pythonic的光標的最佳方法。
編輯 : 雖然在2014年這是真的,現代版本的pymongo和MongoDB已經改變了這種行為。 買家要小心:
.count()
是查找查詢中返回的結果數的正確方法。 count()
方法不會耗盡游標的迭代器,因此您可以在迭代結果集中的項之前安全地執行.count()
檢查。
MongoDB 2.4中計數方法的性能得到了極大的提高。 唯一可能減慢count
速度的是查詢是否設置了索引。 要查明您是否有查詢索引,您可以執行類似的操作
query = collection.find({"string": field})
print query.explain()
如果在結果中看到BasicCursor
,則需要在此string
字段上為此查詢添加索引。
編輯 :正如@alvapan指出的那樣, 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.