MongoDB和upsert问题

我有两个型号:

1 ResourceVacation:

@Id private String resourceID; private List 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”:“测试“}]}

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

ELSE:插入一个新的ResourceVacation

  Vacation vacation = new Vacation("a", "a", "a"); List list = new ArrayList(); 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); 

我得到以下exception:

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

首先,它看起来并不像你在做一个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。 您将需要检查您使用的是哪个版本,因为它不用于允许upsert 。 该问题已标记为已解决。 如果你坚持使用旧版本,那么这里有一个解决方法。

如果您是最新的,您应该能够直接使用新添加的upsert方法,如此处所述。

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