【问题标题】:PyMongo: How To Update A Collection Using Aggregate? [duplicate]PyMongo:如何使用聚合更新集合? [复制]
【发布时间】:2018-11-08 08:48:56
【问题描述】:

这是this 问题的延续。

我正在使用以下代码从集合 C_a 中查找其文本包含单词 StackOverflow 的所有文档,并将它们存储在另一个名为 C_b 的集合中:

import pymongo
from pymongo import MongoClient
client = MongoClient('127.0.0.1')  # mongodb running locally
dbRead = client['C_a']            # using the test database in mongo
# create the pipeline required 
pipeline = [{"$match": {"$text": {"$search":"StackOverflow"}}},{"$out":"C_b"}]  # all attribute and operator need to quoted in pymongo
dbRead.C_a.aggregate(pipeline)  #execution 
print (dbRead.C_b.count()) ## verify count of the new collection 

这很好用,但是,如果我对多个关键字运行相同的 sn-p,结果会被覆盖。例如,我希望集合C_b 包含所有包含关键字StackOverflow、StackExchange 和Programming 的文档。为此,我只需使用上述关键字迭代 sn-p。但不幸的是,每次迭代都会覆盖前一次。

问题:我如何更新输出集合而不是覆盖它?

另外:有没有避免重复的聪明方法,还是我必须在事后检查重复?

【问题讨论】:

  • $out will overwrite the collection if it exists。为什么需要创建新集合?为什么改为查询原始集合不能满足要求?
  • @KevinAdistambha 以上是一个玩具示例。事实上,我有一个非常大的文档集合,我想从关键字列表(超过 200 个)中提取包含关键字的所有文档,并在各个轴上研究它们。为此,我想使用这些特定文档创建一个集合。现在有没有办法做这样的事情?
  • 好“真正的 MongoDB 员工”直接将您指向文档,告诉您您的“询问”是不可能的。唯一的选项是 A. 使用 $out 的新集合。 B. 在返回的游标上迭代结果并将更新写回。当然,B 意味着将结果和更新“通过网络”传输回来,这似乎正是您想要避免的。您应该注意非常清楚的课程。\

标签: mongodb pymongo


【解决方案1】:

如果您查看文档 $out 不支持更新

https://docs.mongodb.com/manual/reference/operator/aggregation/out/#pipe._S_out

所以你需要做一个两阶段的操作

pipeline = [{"$match": {"$text": {"$search":"StackOverflow"}}},{"$out":"temp"}]  # all attribute and operator need to quoted in pymongo
dbRead.C_a.aggregate(pipeline)

然后使用

中讨论的方法

https://stackoverflow.com/a/37433640/2830850

dbRead.C_b.insert(
   dbRead.temp.aggregate([]).toArray()
)

在开始运行之前,您需要删除 C_b 集合

【讨论】:

  • 所以$out 的重点是避免 16MB BSON 限制。然后您建议将整个集合读入insert(),它也具有相同的 16MB 限制。这在任何实际情况下都行不通。无论如何,这也不是“更新”。
  • 那么唯一的方法就是以某种方式更新您的聚合以处理多个值,而不是一次执行一个步骤
  • 重点是这是错误的。因此,评论让那些不理解非常清楚的文档的穷人认为这确实是一个错误的答案。
  • @TarunLalwani dbRead.C_b.insert(dbRead.temp.aggregate([]).toArray()) 返回 AttributeError: 'CommandCursor' object has no attribute 'toArray' 错误。
  • 试试dbRead.C_b.insert(list(dbRead.temp.aggregate([])))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 2021-07-04
  • 2021-05-14
  • 2018-01-09
  • 2016-02-02
相关资源
最近更新 更多