Spring Data MongoDB 和批量更新

15

我正在使用Spring Data MongoDB,并希望执行类似于此处描述的批量更新: http://docs.mongodb.org/manual/reference/method/Bulk.find.update/#Bulk.find.update

当使用普通的驱动程序时,代码如下:

以下示例为items集合初始化一个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中实现类似的结果?

3个回答

32

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();

如何通过“Update”实例指定应从“user”对象设置字段?即,“user”的所有非空字段都应作为“{$set: {key:“value”}}”对出现在“Update”中。 - dma_k

6

只要驱动程序是最新的,你所连接的服务器至少是 MongoDB(这是批量操作所必需的),那么你就可以使用它。目前在 Spring Data 中并没有直接的支持(同样适用于其他更高级别的驱动程序抽象层),但你当然可以访问实现对 批量 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


4
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字段,则上述代码将起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接