Java MongoDB和upsert问题

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

我有两种型号:

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

我需要取消假期;如果我需要的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)