春季数据 MongoDB 和批量更新

2022-09-03 17:18:21

我正在使用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获得类似的结果?


答案 1

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

答案 2

只要驱动程序是最新的,并且您正在与之通信的服务器至少是MongoDB,就可以使用它,这是批量操作所必需的。不要相信现在spring数据中有任何东西直接存在(对于其他更高级别的驱动程序抽象来说也是如此),但你当然可以访问实现对批量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);

您可以通过定义它们来填写所需的类型,也可以使用spring mongo库中提供的构建器,这些构建器都应该支持“提取”它们构建的。DBObjectDBObject