Mongodb 如何将Mongo DB聚合结果附加到现有集合?
我试图使用以下代码对现有的Mongo DB集合执行几次插入Mongodb 如何将Mongo DB聚合结果附加到现有集合?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我试图使用以下代码对现有的Mongo DB集合执行几次插入 db.dados_meteo.aggregate( [ { $match : { "POM" : "AguiardaBeira" } }, { $project : { _id : { $concat: [ "0001:", { $s
db.dados_meteo.aggregate( [
{ $match : { "POM" : "AguiardaBeira" } },
{ $project : {
_id : { $concat: [
"0001:",
{ $substr: [ "$DTM", 0, 4 ] },
{ $substr: [ "$DTM", 5, 2 ] },
{ $substr: [ "$DTM", 8, 2 ] },
{ $substr: [ "$DTM", 11, 2 ] },
{ $substr: [ "$DTM", 14, 2 ] },
{ $substr: [ "$DTM", 17, 2 ] }
] },
"RNF" : 1, "WET":1,"HMD":1,"TMP":1 } },
{ $out : "dados_meteo_reloaded" }
] )
但每次我更改$match参数并进行新的聚合时,Mongo DB都会删除以前的文档并插入新结果
你能帮我吗?简短的回答是“你不能”:
如果$out操作指定的集合已经存在,则在聚合完成后,$out阶段会以原子方式将现有集合替换为新的结果集合。$out操作不会更改上一个集合上存在的任何索引。如果聚合失败,$out操作不会对预先存在的集合进行任何更改
作为一种解决方法,您可以在聚合后通过以下几种方法之一将$out
指定的集合文档复制到“永久”集合中(但最好不使用任何一种方法):
- 注意警告,这是最简单的。不要为了小结果而使用其他方法
- 使用JS:
db.out.find().forEach(函数(doc){db.target.insert(doc)})
- 使用mongoexport/mongoimport
db.targetCollection.insertMany(db.runCommand)(
{
聚合:“sourceCollection”,
管道:
[
{$skip:0},
{$limit:5},
{
$项目:
{
myObject:“$$ROOT”,
processedDate:{$add:[新的ISODate(),0]}
}
}
]
}).result)
启动Mongo 4.2
,新的聚合运算符(类似于$out
)允许将聚合管道的结果合并到指定集合中:
鉴于这一投入:
db.source.insert([
{ "_id": "id_1", "a": 34 },
{ "_id": "id_3", "a": 38 },
{ "_id": "id_4", "a": 54 }
])
db.target.insert([
{ "_id": "id_1", "a": 12 },
{ "_id": "id_2", "a": 54 }
])
$merge
聚合阶段可以这样使用:
db.source.aggregate([
// { $whatever aggregation stage, for this example, we just keep records as is }
{ $merge: { into: "target" } }
])
制作:
// > db.target.find()
{ "_id" : "id_1", "a" : 34 }
{ "_id" : "id_2", "a" : 54 }
{ "_id" : "id_3", "a" : 38 }
{ "_id" : "id_4", "a" : 54 }
请注意,$merge
运算符用于指定如何合并与现有记录冲突的插入记录
在这种情况下(使用默认选项),这:
- 保留目标集合的现有文档(这是
的情况){“\u id”:“id\u 2”,“a”:54}
- 将聚合管道输出中的文档插入到目标集合中(基于
-这是\u id
的情况){“\u id”:“id\u 3”,“a”:38}
- 当聚合管道生成目标集合中存在的文档时,替换目标集合的记录(基于
-这是{u id
替换为{u id:“id\u 1”,“a”:12}
){u id:“id\u 1”,“a”:34}
Mongo 4.4
,$merge
可以输出到正在聚合的同一个集合: