MongoDB集合链

时间:2016-10-12 17:39:12

标签: python mongodb pymongo

我有一个需要解决的问题。目前我的代码使用一个集合,我为一个构建集合创建了一个游标。它看起来像这样:

foreach($csvArray as $row) {
    foreach($row as $key => $value) {
        if(empty($value)) {
            unset($key);    
        }
    }
}

我使用的定义返回此值,以便我可以使用它访问信息。 我希望能够为此添加另一个集合,并将两个集合视为相同。

from pymongo import MongoClient
from itertools import chain

db = MongoClient('10.39.165.193', 27017)['mean-dev']
cursor = db.collection1.find().limit(10).sort('number', -1)

我尝试的是这个(但确实有效):

cursor2 =  db.collection1.find().limit(10).sort('number', -1)
joinCursors = ... # Somehow join cursors

当我只是打印joinCursor时。我得到了我的数据库中的最后一件事,这不是我想要的。我想要的是同样的事情,因为我只返回cursor1,即:。所以我可以使用像计数这样的东西,例如:

joinCursor = [x for x in chain(cursor1, cursor2)]

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是编写自己的JoinedCursor类,例如:

class JoinedCursor:
    def __init__(self, db, collection1, collection2, limit=None, sort_on=None, order=1):
        self.limit = limit
        self.sort_on = sort_on
        self.order = order
        self.cursor1 = db[collection1].find()
        self.cursor2 = db[collection2].find()

    def __iter__(self):

        for doc in self.cursor1.limit(self.limit).sort(self.sort_on, self.order):
            yield doc
        for doc in self.cursor2.limit(self.limit).sort(self.sort_on, self.order):
            yield doc

    def count(self):

        return self.cursor1.count() + self.cursor2.count()

然后,您可以在两个集合上创建连接游标,如下所示:

db = pymongo.MongoClient()["test-join"]
joined_cursor = JoinedCursor(db, "collection1", "collection2", limit=10, sort_on="num", order=-1)

您可以使用for循环按顺序迭代这两个并调用count方法:

for doc in joined_cursor:
    print(doc)

print(joined_cursor.count())

这当然可以更广泛地采用两个或更多集合并应用查询等。