2

我有两个模型:

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”:“测试” } ] }

我需要更新假期;如果我需要的资源 ID 已经存在于 ResourceVacation 中,请将“vacationList”替换为我拥有的 json。

ELSE:插入一个新的 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
4

2 回答 2

1

首先,看起来你根本没有在做一个 upsert。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。该问题被标记为已解决。如果您卡在旧版本上,那么这里描述了一种解决方法

如果你是最新的,你应该可以直接使用新添加的 upsert 方法,如此所述。

于 2012-05-08T07:05:30.510 回答
0

该异常可能是由 updateFirst 方法的已知错误引起的。看看这里

于 2012-05-08T19:55:17.473 回答