gpt4 book ai didi

java - MongoDB 和 upsert 问题

转载 作者:可可西里 更新时间:2023-11-01 10:44:40 25 4
gpt4 key购买 nike

我有两个模型:

1-资源假期:

    @Id
private String resourceID;
private List<Vacation> vacationList;

2-假期:

@Id
private String id;
private String start;
private String title;

插入 ResourceVacation 后的 JSON:

{ "_id" : "foo", "_class" : "com.test.model.ResourceVacation", "vacationList" : [ { "_id" : "1", "start" : "abc", "title" : "test" } ] }

我需要插入一个假期;如果我需要的 resourceId 已经存在于 ResourceVacation 中,请将“vacationList”替换为我拥有的 json。

其他:插入一个新的 ResourceVacation

    Vacation vacation = new Vacation("a", "a", "a");
List<Vacation> list = new ArrayList<Vacation>();
list.add(vacation);

ResourceVacation resourceVacation = new ResourceVacation("foo", list);
MongoOperations mongoOperations = mongoConfiguration.getMongoTemplate();
DBCollection db = mongoOperations.getCollection("resourceVacation");

BasicDBObject myQuery = new BasicDBObject("_id", resourceVacation.getResourceID());
BasicDBObject myUpdate = new BasicDBObject("push ", new BasicDBObject("vacationList",
resourceVacation.getVacationList()));

db.update(myQuery, myUpdate);

我得到以下异常:

java.lang.IllegalArgumentException: can't serialize class com.springway.model.Vacation

最佳答案

首先,您看起来根本不像是在进行更新插入。 Java API 中的语法会将 db.update 的第三个参数设置为 true。

   db.update(com.mongodb.DBObject, com.mongodb.DBObject, boolean /*upsert */, boolean /* multi */)

你也不应该做 $push - 你说你想在 mongo shell 中做的事情的语义是:

db.collection.update( {"resourceVacation":resourceID}, {$set:{"vacationList":[...]}, true)

这是说:如果具有 resourceID 的 resourceVacation 存在,则将其“vacationList”设为我给你的。如果不存在则插入这条记录。

如果您直接使用 Java API,上面的等价物就足够了。

看起来您正在使用 Spring 的 MongoTemplate。您需要检查您使用的是哪个版本,因为它不允许 upserts .该问题已标记为已解决。如果您坚持使用旧版本,则有一个解决方法描述 here .

如果你是最新的,你应该可以直接使用新添加的upsert方法,如描述here .

关于java - MongoDB 和 upsert 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10490205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com