Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何将Mongo DB聚合结果附加到现有集合?_Mongodb_Aggregation Framework - Fatal编程技术网

Mongodb 如何将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

我试图使用以下代码对现有的Mongo DB集合执行几次插入

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}


真不敢相信他们没有办法添加。这是一个拥有数百万资金的db?可怜的Ori你的答案看起来不错。您可能希望编辑它并添加此选项。db.col1.insert(db.col2.aggregate(…).toArray())可能重复的$merge也有一个限制,它不允许合并到我们正在执行聚合的同一个集合中开始
Mongo 4.4
$merge
可以输出到正在聚合的同一个集合: