Spring Data MongoDB и массовое обновление

Я использую Spring Data MongoDB и хочу выполнить массовое обновление, как описано здесь: http://docs.mongodb.org/manual/reference/method/Bulk.find.update/#Bulk.find.update.

При использовании штатного драйвера это выглядит так:

В следующем примере инициализируется построитель операций Bulk () для коллекции элементов и добавляются различные операции множественного обновления в список операций.

var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "D" } ).update( { $set: { status: "I", points: "0" } } );
bulk.find( { item: null } ).update( { $set: { item: "TBD" } } );
bulk.execute()

Есть ли способ добиться аналогичного результата с помощью Spring Data MongoDB?


person Rafal G.    schedule 30.10.2014    source источник


Ответы (3)


Массовые обновления поддерживаются в spring-data-mongodb 1.9.0.RELEASE. Вот образец:

BulkOperations ops = template.bulkOps(BulkMode.UNORDERED, Match.class);
for (User user : users) {
    Update update = new Update();
    ...
    ops.updateOne(query(where("id").is(user.getId())), update);
}
ops.execute();
person jalogar    schedule 04.05.2016
comment
Как можно указать через экземпляр Update, что поля должны устанавливаться из объекта user? Т.е. все ненулевые поля из user должны оказаться парами {$set: {key: "value"}} в Update. - person dma_k; 14.04.2020

Вы можете использовать это, пока драйвер актуален, а сервер, с которым вы разговариваете, имеет как минимум MongoDB, что требуется для массовых операций. Не верьте, что прямо сейчас в данных Spring есть что-то (и почти то же самое для других абстракций драйверов более высокого уровня), но вы, конечно, можете получить доступ к собственному объекту коллекции драйверов, который реализует доступ к Bulk API:

    DBCollection collection = mongoOperation.getCollection("collection");
    BulkWriteOperation bulk = collection.initializeOrderedBulkOperation();

    bulk.find(new BasicDBObject("status","D"))
        .update(new BasicDBObject(
            new BasicDBObject(
                "$set",new BasicDBObject(
                    "status", "I"
                ).append(
                    "points", 0
                )
            )
        ));

    bulk.find(new BasicDBObject("item",null))
        .update(new BasicDBObject(
            new BasicDBObject(
                "$set", new BasicDBObject("item","TBD")
            )
        ));


    BulkWriteResult writeResult = bulk.execute();
    System.out.println(writeResult);

Вы можете заполнить DBObject требуемые типы, определив их, или использовать компоновщики, поставляемые в библиотеке spring mongo, которые все должны поддерживать «извлечение» DBObject, которые они создают.

person Neil Lunn    schedule 31.10.2014

public <T> void bulkUpdate(String collectionName, List<T> documents, Class<T> tClass) {
    BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, tClass, collectionName);
    for (T document : documents) {
        Document doc = new Document();
        mongoTemplate.getConverter().write(document, doc);
        org.springframework.data.mongodb.core.query.Query  query = new org.springframework
            .data.mongodb.core.query.Query(Criteria.where(UNDERSCORE_ID).is(doc.get(UNDERSCORE_ID)));
        Document updateDoc = new Document();
        updateDoc.append("$set", doc);
        Update update = Update.fromDocument(updateDoc, UNDERSCORE_ID);
        bulkOps.upsert(query, update);
    }
    bulkOps.execute();
}

Для выполнения обновления используется шаблон Spring Mongo. Приведенный выше код будет работать, если вы укажете поле _id в списке документов.

person Nitesh Agarwal    schedule 07.08.2020