将文档从一个集合移到另一个集合将覆盖该文档

时间:2019-02-20 08:47:46

标签: java mongodb aggregation-framework spring-data-mongodb

通过与id [1602271]匹配的第一个操作,它创建了一个新集合并保存了一个doc(下文提到的doc)。

{
  "_id": "1602271",
  "date": "2019-02-11T06:25:13.425Z",
  "currentStatus": "scheduled",
  "statusHistory": [
    {
      "status": "onboarded",
      "date": "2018-11-02T10:07:11.167Z"
    },
    {
      "status": "preference_ready",
      "date": "2018-11-02T10:08:56.359Z"
    },
    {
      "status": "scheduled",
      "date": "2018-11-02T10:26:38.721Z"
    }
  ]
}

使用第二个操作id [1602131],它不是在创建新文档,而是用旧文档(JSON之上)覆盖。

{
  "_id": "1602131",
  "date": "2019-01-22T07:08:58.253Z",
  "currentStatus": "scheduled",
  "statusHistory": [
    {
      "status": "onboarded",
      "date": "2018-11-02T06:07:28.765Z"
    },
    {
      "status": "preference_ready",
      "date": "2018-11-02T06:11:30.777Z"
    },
    {
      "status": "scheduled",
      "date": "2018-11-29T05:48:57.871Z"
    }
  ]
}

请参考以下代码:

  public static final String STATUS_COLLECTION_NAME = "TeacherStatus";

  public static final String ARCHIVE_STATUS_COLLECTION_NAME = 
                "ArchiveTeacherStatus";

    Aggregation aggregation = Aggregation.newAggregation(match(where("_id").is(teacherId)),
                    out(ARCHIVE_STATUS_COLLECTION_NAME));
            mongoOperations.aggregate(aggregation, STATUS_COLLECTION_NAME, TeacherStatus.class);

1 个答案:

答案 0 :(得分:1)

按预期工作。 https://docs.mongodb.com/manual/reference/operator/aggregation/out/

  

如果由$out操作指定的集合已经存在,则聚合完成后,$out阶段将用新的结果集合原子替换现有的集合。

在mongodb 4.2中,$out阶段将可以接受附加参数mode,这可以接受值“ replaceCollection”(现在发生了什么),“ replaceDocuments”,“ insertDocuments”(什么您想要的。)


重新阅读代码后,为什么要使用带有$out聚合管道来复制一个文档?那是用大炮狩猎的麻雀。

您可以通过该应用更可靠地进行操作。阅读文档,然后将其保存到其他集合中。