我有两种模式:
1-ResourceVacation:
@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。
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
答案 0 :(得分: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)
这说:如果resourceVacation存在resourceID,那么将它的“vacationList”设置为我给你的。如果它不存在则插入此记录。
如果您直接使用Java API,则相当于上述内容就足够了。
看起来你正在使用Spring的MongoTemplate。您需要检查您使用的是哪个版本,因为它不允许使用upserts。该问题已标记为已解决。如果你坚持使用旧版本,那么就会有here所述的解决方法。
如果你是最新的,你应该可以直接使用新添加的upsert方法,如here所述。
答案 1 :(得分:0)
异常可能是由updateFirst方法的已知错误引起的。看看here。