【问题标题】:Chain two Pymongo Cursors链接两个 Pymongo 光标
【发布时间】:2013-07-29 14:12:58
【问题描述】:

是否可以将两个 Pymongo 光标链接在一起?它们看起来与生成器足够相似,我想可能只使用使用 itertools 来链接它们,但遗憾的是这不起作用。此外,我尝试将 union 选项用于其他返回,但光标对象不存在。

当我在光标对象上调用 dir 时,我看到的最有希望的是 add_option,但这似乎是针对不同的东西。

可以通过将每个 mongo 对象添加到列表并遍历它来实现类似的东西,但是由于很多原因,这似乎是一个糟糕的选择,所以我想知道是否有一些内置的为此功能或更优雅的hack。有什么想法吗?

一般不工作的代码:

        prod_cursor = self.prod_index.find_modules_by_category("fakeqwerty")  # empty generators
        edge_cursor = self.edge_index.find_modules_by_category("fakeqwerty")
        for k, v in kwargs["queries"].items():
            prod_function = getattr(self.prod_index, k)
            itertools.chain(prod_cursor, prod_function(*v))
            edge_function = getattr(self.edge_index, k)
            itertools.chain(edge_cursor, edge_function(*v))

edge 和 prod 函数的结果都是游标。

更新:

为了清楚起见,我希望结果保持为光标,而不是转换为功能较少的类型,因为我在代码库的其他地方使用了诸如 count 之类的函数。

【问题讨论】:

  • itertools.chain 当然应该工作。当你尝试它时,什么“不起作用”,你使用了什么代码?
  • @kindall 使用 itertools.chain 将其转换为生成器,这导致光标丢失了光标所具有的许多方法,例如我在应用程序中其他地方需要的计数。
  • itertools.chain 用于迭代可迭代链;它没有太多其他用途,您通常会直接在“for”语句中使用它。但是创建自己的类来做到这一点很容易。实际上,可能会为提交到项目提供一个不错的补丁。
  • @kindall 好建议。实际上,我可能会开始对此进行破解,尽管理想情况下我正在寻找更多快速解决此问题的方法,但为子孙后代咬紧牙关可能会更好。

标签: python mongodb pymongo


【解决方案1】:

此代码有效:

>>> from pymongo import MongoClient
>>> from itertools import chain

>>> mc = MongoClient()
>>> db = mc["test_db"]
>>> col = db["test_collection"]

>>> col.insert({"aaaa":1})
>>> col.insert({"bbbb":2})

>>> cur1 = col.find({"aaaa":1})
>>> cur2 = col.find({"bbbb":2})

>>> data = [x for x in chain(cur1, cur2)]
>>> data
[{u'aaaa': 1, u'_id': ObjectId('51f6a2ef0fef4e0daccc50e1')}, {u'_id': ObjectId('51f6a2fb0fef4e0daccc50e2'), u'bbbb': 2}]

【讨论】:

  • 我应该指定我需要对象作为光标保留,但事实就是这样。
  • 不是。这是<class 'list'>
猜你喜欢
  • 2018-04-14
  • 2012-05-12
  • 2016-12-31
  • 2012-10-25
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2017-03-18
相关资源
最近更新 更多