2016-10-10 43 views
2

在我的測試代碼中,我首先使用MongoTemplate.upsert()執行常規upsert。它正確地將數據添加到數據庫,並在以下文件出現在分貝,正如預期:Spring,MongoDB和upserts:與一對一更新一起工作,在批量更新時失敗

{ "_id" : 1, "elements" : [ { "payload" : "payload" } ] } 

我然後使用BulkOperations執行類似的更新插入。它失敗,但有以下例外:

org.bson.codecs.configuration.CodecConfigurationException:無法找到類Element的編解碼器。

我認爲這兩個調用應該具有相同的性能。我在BulkOperations API中丟失了什麼?我怎樣才能讓批量操作以與常規操作相同的方式對對象進行編碼?

我用蒙戈的Java驅動程序3.3.0(類似的問題也可以在2.14.3觀察)

public class Main { 
    public static void main(String[] args) throws UnknownHostException { 
     MongoTemplate template = new MongoTemplate(new Mongo("localhost"), "local"); 

     // works 
     template.upsert(makeQuery(1), makeUpdate(), Data.class); 

     // fails miserably 
     BulkOperations ops = template.bulkOps(BulkOperations.BulkMode.UNORDERED, Data.class); 
     ops.upsert(makeQuery(2), makeUpdate()); 
     ops.execute(); 
    } 

    private static Query makeQuery(int id) { 
     return Query.query(Criteria.where("id").is(id)); 
    } 

    private static Update makeUpdate() { 
     Update update = new Update(); 
     update.set("elements", Collections.singletonList(new Element())); 
     return update; 
    } 
} 

@Document(collection = "test") 
class Data { 
    private int id = 1; 
    private List<Element> elements; 
} 

class Element { 
    private String payload = "payload"; 
} 

回答

1

好像有一個錯誤在彈簧數據蒙戈在批量更新List字段中,並且List中的項不是標量(如String,Integer)。它抱怨沒有codes

有一個方式,以避免它

private static Update makeUpdate() { 
    Update update = new Update(); 
    update.set("elements", mongoConverter.convertToMongoType(Collections.singletonList(new Element()))); 
    return update; 
} 

其中mongoConverterorg.springframework.data.mongodb.core.convert.mongoConverter,你可以在你的bean自動裝配一個實例。