【问题标题】:Concatenate pymongo Cursor连接 pymongo 光标
【发布时间】:2018-04-14 23:08:41
【问题描述】:

如何连接多个 pymongo 光标?如果不是不可能,你如何从多个游标中获取结果并创建一个新的?

例子:

result1 = db[collection].find(query1)
result2 = db[collection].find(query2)
concat_result = result1 + result2 #something like that.

更新: 这里的所有答案似乎都考虑到查询的格式相同。例如。 query1 可能会在日期之间获得 2 个文档,因为 query2 可能会按类别对文档进行排序,并且可能会受到 5 个计数的限制。$or 对于我需要的东西来说太同质了。连接这两个查询后,我需要根据另一个键对它们进行排序。

有关更多详细信息,Printer 类需要接收 pymongo.Cursor 并且只有一个,我对此感到困惑。

【问题讨论】:

  • 没有。但是您可能的意思是将每个查询作为$or 的参数发出,它实际上包含两个结果集。所以.find({ "$or": [{ "a": 1 },{ "b": 2 }] }) 就像为每个条件运行两个查询一样。

标签: mongodb concatenation pymongo


【解决方案1】:

是的,明智的解决方案是使用如上所述的 $or。 如果你想以 Python 的方式这样做,那么你可以:

a = [item for item in db[collection].find({filters},{select_fields})]
b = [item for item in db[collection].find({filters},{select_fields})]
c = []
for x,y in zip(a,b):
      c += [x, y]

【讨论】:

    【解决方案2】:

    最简单的方法是使用 mongo $or 之类的操作符

    db[collection].find({'$or': [query1, query2]})
    

    或者如果你必须在 python 中执行此操作

    def concat_results(*results):
       ids = set()
       for result in results:
           for v in result:
               if v['_id'] not in ids:
                   ids.add(v['_id'])
                   yield v1
    concat_result = list(concat_results(result1, result2))
    

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 2012-05-12
      • 2018-08-25
      • 2015-09-24
      • 2012-10-25
      • 2021-07-25
      • 2013-07-06
      • 2016-12-31
      • 2020-08-14
      相关资源
      最近更新 更多