PyMongo光标迭代(PyMongo Cursor Iteration)

2019-09-16 23:57发布

我期待创建和处理光标在python光标的方式在本地工作蒙哥。 我知道预期的方法是做“结果= collection.find()”和“在结果备案”做了,但我在寻找一个类来包装迭代功能。 我希望能够创建一个新的类对象,并调用一个函数如init_cursor()做一个数据库连接,并做了查找返回一个指针。 然后,我会喜欢有一个会移动到下一个结果,并根据结果集类的数据成员get_next()函数。 下面是04-0030-03代码:

class dataIter():
    def __init__(self):
        self.collection = pymongo.Connection().db.collection
        self.cursor = self.collection.find({}) #return all
        self.age = None
        self.gender = None

    def get_next(self):
        if self.cursor.hasNext():
            data = self.cursor.next()
            self.set_data(data)

    def set_data(self, data):
        self.age = data['age']
        self.gender = data['gender']

这样,我就能够简单地调用:

obj.get_next()
age = obj.age
gender = obj.gender

或其他一些帮助功能拉出来的数据每个文件

Answer 1:

我不明白怎么样你是显示的是,只是在做任何更多的便利:

col = pymongo.Connection().db.collection
cur = col.find({})

obj = next(cur, None)
if obj:
    age = obj['age']
    gender = obj['gender']

它不清楚这个包装是如何帮助。 此外,如果你真的后什么是ORM,那么不要重新发明轮子,当这存在: http://mongoengine.org/



Answer 2:

你应该使用Python迭代器协议,你的类可以是这样的

class DataIter:
    def __init__(self):
         self.collection = pymongo.Connection().db.collection
         self.cursor = self.collection.find({}) #return all
         self.age = None
         self.gender = None
    def __iter__(self):
         return self
    def next(self):
        if self.cursor.hasNext():
            data = self.cursor.next()
            self.set_data(data)
            return self
        else:
            raise StopIteration

然后,你可以重复这样的

for c in DataIter():
    age = c.age
    gender = c.gender


Answer 3:

你可以使用像你已经张贴那些已经做到这一点。 PyMongo游标没有haveNext方法,但它们具有next方法,该方法或者返回下一个文档,或提高StopIteration (这由Python协议迭代器指定)。

您也可以借此更进一步:而不是在分配类从文档中值的属性,你可以使用__getattr__它实现属性查找的Python类。

全部放在一起,你可能最终的东西,如:

class DataIter(object):

    def __init__(self, cursor):
        self._cursor = cursor
        self._doc = None

    def next(self):
        try:
            self._doc = self._cursor.next()
        except StopIteration:
            self._doc = None
        return self

    def __getattr__(self, key):
        try:
            return self._doc[key]
        except KeyError:
            raise AttributeError('document has no attribute %r' % name)


Answer 4:

这是我结束了去:

class Cursor(object):

    def __init__(self):
        # mongo connection
        self.collection = pymongo.Connection().cursorcollection
        self.loaded = False
        self.cursor = None

    # Cursor calls (for iterating through results)
    def init_cursor(self):
        """ Opens a new cursor """
        if not self.cursor:
            self.cursor = self.collection.find({})

    def get_next(self):
        """ load next object """
        if self.cursor and self.cursor.alive:
            self.set_data(next(self.cursor))
            return True
        else:
            self.cursor = None
            return False

    def has_next(self):
        """ cursor alive? """
        if self.cursor and self.cursor.alive:                                                                                                                                                                                                                                
            return True
        else:
            return False


文章来源: PyMongo Cursor Iteration