MongoDB: db.collection.find() 返回的對象爲 pymongo.cursor.Cursor而不是dict或list

目錄

MongolDB查詢模擬

輸出結果

 將返回的結果在內存中轉化爲list

當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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章