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类型。
相关文章推荐
- mongodb dirver for java【读取操作】
- MongoDB for java and geoSpatial空间操作
- MongoDB for Java】Java操作MongoDB
- 【MongDB for Java】Java操作MongoDB
- mongodb dirver for java【聚合】
- mongodb dirver for java【Text Search】
- java简单操作mongodb
- MongoDB for Java
- java 中 mongodb的各种操作 模糊查询 精确查询 等等
- java学习(三) java 中 mongodb的各种操作
- [转]MongoDB for Java】Java操作MongoDB
- 如何用Java操作MongoDB(1)
- 安卓、java常用文件操作(复制,读取,写入,转换等)
- MongoDB 第三周作业――用java操作MongoDB之删除数组中的元素
- 使用Java代码操作MongoDB(CRUD)方法一
- java 中 mongodb的各种操作 模糊查询 精确查询 等等
- MongoDB for Java Programmer ——2
- java中的文件操作:读取写入byte[]字节流、string字符串、list列表
- java对文件的操作---新建、写入、读取
- java操作mongodb——查询数据