【问题标题】:MongoDB and upsert issueMongoDB 和 upsert 问题
【发布时间】:2012-06-01 02:21:03
【问题描述】:

我有两个模型:

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", “假期列表”:[{“_id”:“1”,“开始”:“abc”,“标题”:“测试”} ] }

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

其他: 插入一个新的 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

【问题讨论】:

  • 我也需要更新假期。

标签: java mongodb


【解决方案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。该问题被标记为已解决。如果您坚持使用旧版本,则可以使用here 描述的解决方法。

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

【讨论】:

  • 我使用了以下内容,如果存在,它会更新记录。否则它什么也不做!你知道我该怎么修吗! mongoOperations.updateFirst(new Query(Criteria.where("_id").is("foo")), Update.update("vacationList",resourceVacation.getVacationList()),ResourceVacation.class);
  • 您需要添加另一个参数来指示“upsert”为真(默认情况下不是)。详情见这里:api.mongodb.org/java/2.2/com/mongodb/DBCollection.html#update
  • 我已经使用过了,但是它抛出了上面提到的异常:java.lang.IllegalArgumentException: can't serialize class com.springway.model.Vacation
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多