2016-10-10 12 views
2

В моем тестовом коде я сначала выполняю регулярный перезапуск с использованием MongoTemplate.upsert(). Он правильно добавляет данные в базу данных, и следующий документ появляется в БД, так же, как и ожидалось:Spring, MongoDB и upserts: работает с обновлениями один за другим, не удается с массовыми обновлениями

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

Затем я выполнить подобную upsert с использованием BulkOperations. Он не работает со следующим исключением:

org.bson.codecs.configuration.CodecConfigurationException: не удается найти кодек для класса Element.

Я думал, что эти два вызова должны выполняться одинаково. Я что-то пропустил в API BulkOperations? Как я могу делать массовые операции для кодирования объектов так же, как это делают обычные операции?

Я использую Монго-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 не является скаляром (например, , Integer). Он жалуется, что нет codes.

Там один способ избежать

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

где mongoConverter является org.springframework.data.mongodb.core.convert.mongoConverter, и вы можете autowire экземпляр в вашем боба.