目錄
當pymongo.cursor.Cursor沒有抓到數據時,就無法判斷next(),即會報錯
MongolDB查詢模擬
import pymongo
x = db.col.find()
# 直接打印輸出內容,發現繼承的是object,而不是dict或者list
print(x)
# 識別試下他的類型
print(type(x))
# 判斷一下是否是可迭代對象
print(hasattr(x, '__iter__'))
print(hasattr(x, '__next__'))
# 是否實現了__dict__
print(hasattr(x, '__dict__'))
# 輸出插入的所有文檔對應的 _id 值
print(f'{collection} col find count: {len(x)}')
輸出結果
<pymongo.cursor.Cursor object at 0x00000147062B0C88>
<class 'pymongo.cursor.Cursor'>
True
True
True
Traceback (most recent call last):
File "E:/work_space/warclouds/version01/openstack_api_server/cloudenforce/vmware_api/vcenter_mongo.py", line 98, in <module>
find_object(collection='vcenter_vm')
File "E:/work_space/warclouds/version01/openstack_api_server/cloudenforce/vmware_api/vcenter_mongo.py", line 92, in find_object
print(f'{collection} col find count: {len(x)}')
TypeError: object of type 'Cursor' has no len()
將返回的結果在內存中轉化爲list
# 判斷一下是否是可迭代對象
print(hasattr(x, '__iter__'))
print(hasattr(x, '__next__'))
#
print(hasattr(x, '__dict__'))
# 將可迭代對象轉化爲list
result = [doc for doc in x]
print(result)
# 輸出插入的所有文檔對應的 _id 值
print(f'{collection} col find count: {len(result)}')
當pymongo.cursor.Cursor沒有抓到數據時,就無法判斷next(),即會報錯
<pymongo.cursor.Cursor object at 0x0000021A8E5AEC50>
<class 'pymongo.cursor.Cursor'>
Traceback (most recent call last):
File "E:/work_space/warclouds/version01/openstack_api_server/cloudenforce/vmware_api/vcenter_mongo.py", line 101, in <module>
find_object(collection='vcenter_vm')
File "E:/work_space/warclouds/version01/openstack_api_server/cloudenforce/vmware_api/vcenter_mongo.py", line 85, in find_object
print(x.next())
File "E:\work_space\warclouds\version01\openstack_api_server\venv\lib\site-packages\pymongo\cursor.py", line 1164, in next
raise StopIteration
StopIteration
粗略看一下這個數據包裝類的可迭代實現
class CousorType:
.....
def __iter__(self):
return self
def next(self):
"""Advance the cursor."""
if self.__empty:
raise StopIteration
if len(self.__data) or self._refresh():
if self.__manipulate:
_db = self.__collection.database
return _db._fix_outgoing(self.__data.popleft(),
self.__collection)
else:
return self.__data.popleft()
else:
raise StopIteration
__next__ = next