您的位置:首页 > 数据库 > Mongodb

mongodb dirver for java【写入操作】

2017-06-28 17:25 495 查看

环境

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()
方法最多只更新一个文档。

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

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


说明:

Updates.set
:设置字段
stars
1
和字段
contact.phone
228-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));


说明:

upsert
true
,要是文档中没有,就创建一个新的文档。默认为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));


说明:

upsert
true
,要是文档中没有,就创建一个新的文档。默认为false。

bypassDocumentationValidation
:是否绕过文档验证。

Delete 文档

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

Filters

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

过滤器文档格式和
read operations
中一样。

这里也可以参考我翻译文章:mongodb dirver for java【读取操作】

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

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

这里的空指的是:
Document document = new Document();


删除 一个文档

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

下面代码对
_id
ObjectId("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);


注意:

MongoDatabase
MongoCollection
实例是不可变的。

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

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

你可以构建
MongoClientOptions
MongoDatabase
或者
MongoCollection
来包含
write concern
read concern
read preference
的组合。

如下所示:

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


总结

在驱动程序
2+
中,其实是有
insert()
update()
方法。

3+
中,已经没有了有的只是:

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


可以说变化是非常大,因为里面的参数都变成了
Bson
类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: