如何比较两个不常见的集合和归档文档

问题描述 投票:0回答:1

我有两个集合,例如CollectionS和Collection都有公共字段,它是主机名

系列A:

    {

  "hostname": "vm01",
  "id": "1",
  "status": "online",

}

收集B.

{

  "hostname": "vm01",
  "id": "string",
  "installedversion": "string",

}

{

  "hostname": "vm02",
  "id": "string",
  "installedversion": "string",

}

我想要实现的是当我收到收集B的帖子时

  • 我想根据主机名检查集合B中是否存在记录,并更新所有值。如果没有插入新记录(我已经读过它可以通过使用upsert实现 - 仍然在寻找如何使其工作) 我想检查集合A中是否存在主机名,如果不是将集合B中的记录移动到集合C的另一个集合(作为存档记录)。来自集合B的上述hostname = vm02记录中的.ie应该移动到集合C

如何使用spring boot mongodb实现这一点任何帮助是值得赞赏的。我必须保存集合B的代码如下所示我想更新以实现上述期望的结果

public RscInstalltionStatusDTO save(RscInstalltionStatusDTO rscInstalltionStatusDTO) {
    log.debug("Request to save RscInstalltionStatus : {}", rscInstalltionStatusDTO);

    RscInstalltionStatus rscInstalltionStatus = rscInstalltionStatusMapper.toEntity(rscInstalltionStatusDTO);
    rscInstalltionStatus = rscInstalltionStatusRepository.save(rscInstalltionStatus);
    return rscInstalltionStatusMapper.toDto(rscInstalltionStatus);
}

更新1:以下工作正如我预期的那样,但我认为应该有更好的方法来做到这一点。

   public RscInstalltionStatusDTO save(RscInstalltionStatusDTO rscInstalltionStatusDTO) {
        log.debug("Request to save RscInstalltionStatus : {}", rscInstalltionStatusDTO);


        RscInstalltionStatus rscInstalltionStatus = rscInstalltionStatusMapper.toEntity(rscInstalltionStatusDTO);
        System.out.print(rscInstalltionStatus.getHostname());
        Query query = new Query(Criteria.where("hostname").is(rscInstalltionStatus.getHostname()));
        Update update = new Update();
        update.set("configdownload",rscInstalltionStatus.getConfigdownload());
        update.set("rscpkgdownload",rscInstalltionStatus.getRscpkgdownload());
        update.set("configextraction",rscInstalltionStatus.getConfigextraction());
        update.set("rscpkgextraction",rscInstalltionStatus.getRscpkgextraction());
        update.set("rscstartup",rscInstalltionStatus.getRscstartup());
        update.set("installedversion",rscInstalltionStatus.getInstalledversion());
        mongoTemplate.upsert(query, update,RscInstalltionStatus.class);
        rscInstalltionStatus = rscInstalltionStatusRepository.findByHostname(rscInstalltionStatus.getHostname());
        return rscInstalltionStatusMapper.toDto(rscInstalltionStatus);
    }

Update2:使用以下代码,我可以将记录移动到另一个集合

String query = "{$lookup:{ from: \"vmdetails\",let: {rschostname: \"$hostname\"},pipeline:[{$match:{$expr:{$ne :[\"$hostname\",\"$$rschostname\"]}}}],as: \"rscInstall\"}},{$unwind:\"$rscInstall\"},{$project:{\"_id\":0,\"rscInstall\":0}}";
AggregationOperation rscInstalltionStatusTypedAggregation = new CustomProjectAggregationOperation(query);


LookupOperation lookupOperation = LookupOperation.newLookup().from("vmdetails").localField("hostname").foreignField("hostname").as("rscInstall");
UnwindOperation unwindOperation = Aggregation.unwind("$rscInstall");

ProjectionOperation projectionOperation = Aggregation.project("_id","rscInstall").andExclude("_id","rscInstall");
OutOperation outOperation = Aggregation.out("RscInstallArchive");
Aggregation aggregation = Aggregation.newAggregation(rscInstalltionStatusTypedAggregation,unwindOperation,projectionOperation,outOperation);
List<BasicDBObject> results = mongoTemplate.aggregate(aggregation,"rsc_installtion_status",BasicDBObject.class).getMappedResults();

我在这里的这个问题是它返回多个记录

mongodb spring-boot spring-data aggregation-framework spring-data-mongodb
1个回答
0
投票

找到解决方案,可能还有其他最佳解决方案,但对我来说,这个解决方案有效

创建一个类customeAggregationGeneration(在SO答案中找到并扩展以满足我的需求)

public class CustomProjectAggregationOperation implements AggregationOperation {

private String jsonOperation;

public CustomProjectAggregationOperation(String jsonOperation) {
    this.jsonOperation = jsonOperation;
}

@Override
public Document toDocument(AggregationOperationContext aggregationOperationContext) {
    return aggregationOperationContext.getMappedObject(Document.parse(jsonOperation));
}
}



  String lookupquery = "{$lookup :{from:\"vmdetails\",localField:\"hostname\",foreignField:\"hostname\"as:\"rscinstall\"}}";
        String matchquery = "{ $match: { \"rscinstall\": { $eq: [] } }}";
        String projectquery = "{$project:{\"rscinstall\":0}}";

        AggregationOperation lookupOpertaion = new CustomProjectAggregationOperation(lookupquery);
        AggregationOperation matchOperation = new CustomProjectAggregationOperation(matchquery);
        AggregationOperation projectOperation = new CustomProjectAggregationOperation(projectquery);

        Aggregation aggregation = Aggregation.newAggregation(lookupOpertaion, matchOperation, projectOperation);
        ArrayList<Document> results1 = (ArrayList<Document>) mongoTemplate.aggregate(aggregation, "rsc_installtion_status", Document.class).getRawResults().get("result");

        // System.out.println(results1);

        for (Document doc : results1) {

         //   System.out.print(doc.get("_id").toString());
            mongoTemplate.insert(doc, "RscInstallArchive");
            delete(doc.get("_id").toString());
© www.soinside.com 2019 - 2024. All rights reserved.