天天看點

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