mongodb dirver for java【写入操作】

41 篇文章 1 订阅

环境

MongoDB:3.+
mongodb dirver for Java: 3.+
@author:喻涛

概要

本篇是翻译官网:
https://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/perform-write-operations/

讲解的是用java代码对MongoDB进行写入操作。

写入操作(插入、更新、替换、删除)

执行写入操作为了插入新文档到集合中,更新集合中已有的文档或者多个文档、在集合中替换已有的文档、或者从集合中删除一个或多个文档。

先决条件

在test数据库中要有一个restaurants集合。
(你可以使用你本地的测试环境中的集合,来做下面的测试)

可能需要import的声明:

 import com.mongodb.*;
 import com.mongodb.MongoClient;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 import com.mongodb.client.model.Filters;
 import static com.mongodb.client.model.Filters.*;
 import static com.mongodb.client.model.Updates.*;
 import com.mongodb.client.model.UpdateOptions;
 import com.mongodb.client.result.*;
 import org.bson.Document;
 import org.bson.types.ObjectId;

 import java.util.List;
 import java.util.Arrays;
 import java.util.ArrayList;

连接数据库

这里我贴出我自己的代码:

            //连接数据库 start
            MongoCredential credential = 
            //根据自己的情况修改
            MongoCredential.createCredential("gg_openapi", 
            "gg_openapi", "gg..openapi#!".toCharArray());
            //根据自己的情况修改
            serverAddress = new ServerAddress("106.75.51.20", 35520);
            List<ServerAddress> addrs = new ArrayList<ServerAddress>();
            addrs.add(serverAddress);
            List<MongoCredential> credentials = new ArrayList<MongoCredential>();
            credentials.add(credential);
            @SuppressWarnings("resource")
            MongoClient mongoClient = new MongoClient(addrs, credentials);
            MongoDatabase database = mongoClient.getDatabase("gg_openapi");
            System.out.println("Connect to database successfully");
            //连接数据库 end

insert 新文档

为了在集合中插入一个文档,可以使用集合中的insertOne()方法。

Document document = new Document("name", "Café Con Leche")
      .append("contact", new Document("phone", "228-555-0149")
      .append("email", "cafeconleche@example.com")
      .append("location",Arrays.asList(-73.92502, 40.8279556)))
      .append("stars", 3)
      .append("categories", Arrays.asList("Bakery", "Coffee", "Pastries"));

collection.insertOne(document);

如果没有指定主键_id字段,java驱动程序会自动添加_id字段插入到文档中。

insert 多个文档

要添加多个文档,你可以使用集合中的方法insertMany()方法,该方法会插入一组文档。

下面例子是插入两个文档:

Document doc1 = new Document("name", "Amarcord Pizzeria")
    .append("contact", new Document("phone", "264-555-0193")
    .append("email", "amarcord.pizzeria@example.net")
    .append("location",Arrays.asList(-73.88502, 40.749556)))
    .append("stars", 2)
    .append("categories", Arrays.asList("Pizzeria", "Italian", "Pasta"));

Document doc2 = new Document("name", "Blue Coffee Bar")
    .append("contact", new Document("phone", "604-555-0102")
    .append("email", "bluecoffeebar@example.com")
    .append("location",Arrays.asList(-73.97902, 40.8479556)))
    .append("stars", 5)
    .append("categories", Arrays.asList("Coffee", "Pastries"));

List<Document> documents = new ArrayList<Document>();
documents.add(doc1);
documents.add(doc2);

collection.insertMany(documents);

如果没有指定主键_id字段,java驱动程序会自动添加_id字段插入到文档中。

update 已有文档

为了在集合中更新已有的文档,你可以使用updateOne()updateMany方法。

Filters

你可以给这个方法传入一个过滤器文档来指定要更新哪些文档。过滤器文档格式和read operations中一样。
这里也可以参考我翻译文章:mongodb dirver for java【读取操作】

为了方便创建过滤对象,java驱动程序提供了Filters助手。

要指定空的过滤器(也就是查询全部的文档),可以使用空的Document对象。

update 操作符

要在一个文档中更新一个字段,MongoDB提供了update operators,要指定使用更新操作符的修改,需要使用更新文档。

为了方便创建更新格式的文档,java驱动程序提供了Updates类,

在update时,_id是不可变的,你不能修改_id字段的值。

update 一个文档

即使过滤器匹配到了多个文档,updateOne()方法最多只更新一个文档。

下面的操作是对_idObjectId("57506d62f57802807471dd41")进行更新。

collection.updateOne(
    eq("_id", new ObjectId("57506d62f57802807471dd41")),
    combine(set("stars", 1), set("contact.phone", "228-555-9999"),       
    currentDate("lastModified")));

说明:

Updates.set:设置字段stars1和字段contact.phone228-555-9999
Updates.currentDate:将字段lastModified修改为当前时间。
如果字段lastModified不存在,该操作会将这个字段添加到文档中去。

在某些情况下,你可能需要更新多个字段,这时使用replace会更有效。
请参考:Replace a Document.

update 多个文档

updateMany方法会更新匹配到的所有文档。

下面操作是对字段stars等于2的所有的文档进行更新。

collection.updateMany(
              eq("stars", 2),
              combine(set("stars", 0), currentDate("lastModified")));

说明 :

Updates.set:将字段stars的值设置为0,并且
Updates.currentDate:将字段lastModified的值设置为当前时间,如果字段lastModified不存在,该操作将其添加进文档。

Update 选项

使用updateOne()updateMany方法时,你可以使用包含UpdateOptions格式的文档来指定upsert选项或者bypassDocumentationValidation选项。

collection.updateOne(
                eq("_id", 1),
                combine(set("name", "Fresh Breads and Tulips"), 
                currentDate("lastModified")),
          new UpdateOptions().upsert(true).bypassDocumentValidation(true));

说明:
upserttrue,要是文档中没有,就创建一个新的文档。默认为false。
bypassDocumentationValidation:是否绕过文档验证。

replace 已有的文档

为了替换在集合中已有的文档,你可以使用集合中replaceOne方法。

_id字段是不可变的,你不能替换_id字段的值。

Filters

你可以传递一个过滤器来指定要替换的文档。
过滤器文档格式和read operations中一样。
这里也可以参考我翻译文章:mongodb dirver for java【读取操作】

为了方便创建过滤对象,java驱动程序提供了Filters助手。

要指定一个空的过滤器(也就是匹配全部文档), 可以使用空的Document对象。
这里的空指的是:Document document = new Document();

即使过滤条件匹配到了多个文档,replaceOne方法最多也就替换一个。

replace 一个文档

要替换一个文档,请传入一个新文档给replaceOne方法。

替换文档可以具有与原始文档不同的字段。在替换文档中,你可以忽略字段_id,因为字段_id是不可变的。然而,如果你包含了字段_id字段,你不能指定不同的的。说白了,以前_id值是多少,你传入的也要和它相同。

下面代码是对_id:ObjectId(“57506d62f57802807471dd41”)进行替换。

collection.replaceOne(
         eq("_id", new ObjectId("57506d62f57802807471dd41")),
         new Document("name", "Green Salads Buffet")
         .append("contact", "TBD")
         .append("categories", Arrays.asList("Salads", "Health Foods", "Buffet")));

另请参考:Update a Document.

update 选项

使用replaceOne方法时,你可以指定一个UpdateOptions文档对象,来指定upsert选项和bypassDocumentationValidation选项。

results = collection.replaceOne(
     eq("name", "Orange Patisserie and Gelateria"),
     new Document("stars", 5)
     .append("contact", "TBD")
     .append("categories", Arrays.asList("Cafe", "Pastries", "Ice Cream")),
     new UpdateOptions().upsert(true).bypassDocumentValidation(true));

说明:
upserttrue,要是文档中没有,就创建一个新的文档。默认为false。
bypassDocumentationValidation:是否绕过文档验证。

Delete 文档

要在集合中删除文档,你可以使用deleteOnedeleteMany方法。

Filters

你可以给删除方法传递一个过滤器文档对象来指定要删除的文档。

过滤器文档格式和read operations中一样。
这里也可以参考我翻译文章:mongodb dirver for java【读取操作】

为了方便创建过滤对象,java驱动程序提供了Filters助手。

要指定一个空的过滤器(也就是匹配全部文档), 可以使用空的Document对象。
这里的空指的是:Document document = new Document();

删除 一个文档

即使过滤条件匹配多个文档,deleteOne方法最多删除一个文档。

下面代码对_idObjectId("57506d62f57802807471dd41")的文档进行删除:

collection.deleteOne(eq("_id", new ObjectId("57506d62f57802807471dd41")));

删除 多个文档

deleteMany方法会删除匹配到的全部文档。
下面的操作是删除字段stars等于4的全部文档。

collection.deleteMany(eq("stars", 4));

Write Concern

Write Concern 描述了MongoDB写入操作要求的确认级别。

应用程序可以在三个层次中配置Write Concern

一、在MongoClient()
①通过MongoClientOptions,如下所示:

MongoClientOptions options = MongoClientOptions.builder()
            .writeConcern(WriteConcern.MAJORITY).build();
MongoClient mongoClient = new MongoClient(Arrays.asList(
            new ServerAddress("host1", 27017),
            new ServerAddress("host1", 27018)), options);

②通过MongoClientURI,如下所示:

 MongoClient mongoClient = new MongoClient(
 new MongoClientURI("mongodb://host1:27017,host2:27017/?w=majority"));

二、在MongoDatabase中通过withWriteConcern方法,如下所示:

 MongoDatabase database = 
 mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY);

三、在MongoCollection中通过withWriteConcern方法,如下所示:

MongoCollection<Document> collection = 
database.getCollection("restaurants").withWriteConcern(WriteConcern.MAJORITY);

注意:

MongoDatabaseMongoCollection实例是不可变的。
在已存在的MongoDatabase和MongoCollection实例中调用withReadPreference()方法会返回一个新的实例并不影响调用该方法的实例。

例如,下面代码,collWithWriteConcern实例的write concernmajoritycollectionwrite concern是不是影响的。

你可以构建MongoClientOptionsMongoDatabase或者MongoCollection来包含write concernread concernread preference的组合。
如下所示:

collection = database.getCollection("restaurants")
                .withReadPreference(ReadPreference.primary())
                .withReadConcern(ReadConcern.MAJORITY)
                .withWriteConcern(WriteConcern.MAJORITY);

总结

在驱动程序2+中,其实是有insert()update()方法。
3+中,已经没有了有的只是:

insertOne()
insertMany()
updateOne()
updateMany()

可以说变化是非常大,因为里面的参数都变成了Bson类型。

Java 中,异步操作 MongoDB 可以通过使用驱动程序如 MongoDB 的官方 Java 驱动 (MongoDB Reactive Streams API 或者 Spring Data MongoDB) 来实现。以下是使用这些工具进行异步操作的基本步骤: 1. **添加依赖**:如果你选择使用 MongoDB Reactive Streams API,需要添加对应的依赖到你的 Maven 或 Gradle 项目中。 ```xml <!-- Maven --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-reactivestreams-driver</artifactId> <version>4.x.y</version> </dependency> <!-- Gradle --> implementation 'org.mongodb:mongo-reactivestreams-driver:4.x.y' ``` 2. **创建反应式MongoClient**:创建一个 `ReactiveMongoClient` 实例,它支持非阻塞的连接和操作。 ```java MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017"); ``` 3. **查询操作的异步处理**:对于读取操作,比如 `reactiveMongoCollection.find()`,可以返回一个 `Flux<T>` 对象,代表无限序列。你可以使用 `subscribe()` 方法将其转换为流,然后进行链式操作。 ```java Flux<Document> documents = reactiveMongoCollection.find(); documents.subscribe(document -> processDocument(document)); ``` 4. **更新、插入和删除操作**:类似地,对于写入操作,如 `reactiveMongoCollection.insertOne()` 和 `reactiveMongoCollection.updateMany()`,也返回 `Mono<Void>` 或 `Flux<Void>`,表示单个结果或者一系列结果。 5. **错误处理**:记得处理可能出现的异常,例如 `onError` 函数用于捕获并处理异常。 ```java documents.subscribe( document -> processDocument(document), error -> handleException(error), () -> System.out.println("All documents processed") ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值