Mongodb PyMongo:如何使用聚合更新集合?

Mongodb PyMongo:如何使用聚合更新集合?,mongodb,pymongo,Mongodb,Pymongo,这是问题的继续 我使用以下代码查找集合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 # cr

这是问题的继续

我使用以下代码查找集合
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 
但是,如果我对多个关键字运行同一个代码段,结果会被覆盖。例如,我希望集合
C_b
包含包含关键字
StackOverflow
StackExchange
编程的所有文档。为此,我只需使用上述关键字迭代代码段。但不幸的是,每次迭代都会覆盖上一次迭代

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


另外:是否有一种巧妙的方法避免重复,或者事后我是否必须检查重复

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

所以你需要做一个两阶段的手术

pipeline = [{"$match": {"$text": {"$search":"StackOverflow"}}},{"$out":"temp"}]  # all attribute and operator need to quoted in pymongo
dbRead.C_a.aggregate(pipeline)
然后使用中讨论的方法


在开始跑步之前,您需要删除
C_b
集合

。为什么需要创建新的集合?为什么不能通过查询原始集合来满足需求呢?@KevinAdistambha以上就是一个玩具示例。事实上,我有一个非常大的文档集合,我想从其中从关键字列表(超过200个)中提取包含关键字的所有文档,并在各个轴上研究它们。为此,我想创建一个包含这些特定文档的集合。现在有没有办法做到这一点呢?这位和蔼可亲的“MongoDB实际员工”直接向您指出,文档告诉您,您的“询问”是不可能的。唯一的选项是使用
$out
的.New集合。在返回的游标上迭代结果并写回更新。当然,B意味着“通过线路”将结果和更新传输回来,这似乎是您正试图避免的。您应该注意这一非常清楚的教训。\n因此,
$out
的全部目的是避免16MB BSON限制。然后,您建议将整个集合读入同样具有16MB限制的
insert()
。这在任何实际情况下都行不通。另外,这也不是一个“更新”。那么,唯一的另一种方法是以某种方式更新聚合以处理多个值,而不是在一个时间点一步执行,这是错误的。因此,这个评论让不理解非常清晰的文档的可怜人知道这确实是一个错误的答案。@TarunLalwani
dbRead.C_b.insert(dbRead.temp.aggregate([]).toArray())
返回一个
AttributeError:'CommandCursor'对象没有属性“toArray”
错误。try
dbRead.C_b.insert(列表(dbRead.temp.aggregate([]))
dbRead.C_b.insert(
   dbRead.temp.aggregate([]).toArray()
)