MongoDB和upsert问题

时间:2012-05-07 22:51:07

标签: java mongodb

我有两种模式:

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

2 个答案:

答案 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