Java MongoDB和upsert问题
我有两种型号: 1-3假期:Java MongoDB和upsert问题,java,mongodb,Java,Mongodb,我有两种型号: 1-3假期: @Id private String resourceID; private List<Vacation> vacationList; 我插入ResourceVacation后的JSON: {u id:“foo”,“u class:“com.test.model.ResourceVacation”, “休假列表”:[{U id:“1”,“开始”:“abc”,“标题”:“测试”} ]} 我需要取消假期;如果我需要的resource
@Id
private String resourceID;
private List<Vacation> vacationList;
我插入ResourceVacation后的JSON:
{u id:“foo”,“u class:“com.test.model.ResourceVacation”,
“休假列表”:[{U id:“1”,“开始”:“abc”,“标题”:“测试”}
]}
我需要取消假期;如果我需要的resourceId已经存在于ResourceVacation中,那么将“vacationList”替换为json中我所拥有的
其他:
插入一个新的资源
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 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”列出来。如果不存在,则插入此记录
如果您直接使用JavaAPI,那么上面的等价项就足够了
看起来您正在使用Spring中的MongoTemplate。您需要检查您正在使用的版本,因为它不允许使用。不过,这个问题被标记为已解决。如果您仍停留在旧版本上,那么有一个解决方法
如果您使用的是最新版本,您应该能够直接使用新添加的upsert方法,如前所述。异常可能是由updateFirst方法的已知错误引起的。看一看。我使用了以下内容,它会更新记录(如果存在)。否则它什么也不做!!你知道我该怎么修吗!mongoOperations.updateFirst(新查询(条件,其中(“\u id”)为(“foo”)),Update.Update(“vacationList”,resourceVacation.getVacationList()),resourceVacation.class);您需要添加另一个参数来指示“upsert”为true(默认情况下,它不是)。请参见此处了解详细信息:我已经使用了它,但它引发了提到的异常:java.lang.IllegalArgumentException:无法序列化类com.springway.model.vacation我也需要升级假期。
db.update(com.mongodb.DBObject, com.mongodb.DBObject, boolean /*upsert */, boolean /* multi */)
db.collection.update( {"resourceVacation":resourceID}, {$set:{"vacationList":[...]}, true)