5

カーソルがmongoでネイティブに機能するように、Pythonでカーソルを作成して処理することを検討しています。意図された方法は、「result = collection.find()」を実行し、「結果のレコード」を実行することですが、反復機能をクラスでラップすることを検討しています。新しいクラスオブジェクトを作成し、init_cursor()などの関数を呼び出してdb接続を確立し、カーソルを返す検索を実行できるようにしたいと思います。次に、次の結果に移動し、結果に基づいてクラスデータメンバーを設定するget_next()関数が必要です。疑似コードは次のとおりです。

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

または各ドキュメントからデータを引き出すためのその他のヘルプ機能

4

4 に答える 4

18

あなたが見せているものが、ただやるよりも便利なのかわかりません。

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

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

このラッパーがどのように役立つかは明確ではありません。また、あなたが本当に求めているのがORMである場合、これが存在するときに車輪の再発明をしないでください:http: //mongoengine.org/

于 2012-05-03T02:06:04.853 に答える
1

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
于 2012-05-03T02:41:25.197 に答える
1

これを達成するために、すでに投稿したもののようなものを使用できます。haveNextPyMongoカーソルにはメソッドがありませんが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)
于 2012-05-03T15:19:27.650 に答える
1

これが私がやったことです:

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
于 2012-05-07T18:58:26.553 に答える