0、前置工作
创建Maven工程,导入依赖:
XML
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.12.7</version>
</dependency>
1、连接MongoDB并测试
注意:确保已经启动MongoDB,最好是把MongoDB设置为自启程序。
java
//连接MongoDB服务器,自带连接池效果
MongoClient mongoClient = MongoClients.create("mongodb://127.0.0.1:27017");
//获取数据库,如果数据库不存在,为该数据库存储数据时自动创建数据库。
MongoDatabase database = mongoClient.getDatabase("test");
//获取集合,如果集合不存在,首次存储数据时,自动创建集合
MongoCollection<Document> collection = database.getCollection("teachers");
//获取数据,获取集合中第一个文档,并转为json打印
System.out.println(collection.find().first().toJson()); //测试
//关闭客户端
if (mongoClient != null){
mongoClient.close();
}
如果有用户名和密码的话,连接的地址应该修改为:
java
mongodb://username:password@host/?authSource=admin
2、Java 操作集合
2.1、创建集合
创建集合有多种方式:创建普通的集合,创建固定大小的集合(capped)、创建带校验规则的集合:
1、创建普通集合
java
/**
* 创建无限定集合
* @param name 集合名称
*/
public void createCollection(String name){
database.createCollection(name);
}
2、创建固定大小的集合
java
/**
* 创建固定大小的集合
* @param name 集合名称
* @param size 集合大小
*/
public void createCollection(String name,long size){
database.createCollection(name,new CreateCollectionOptions().capped(true).sizeInBytes(size));
}
3、创建带校验规则的集合
java
/**
* 创建带校验规则的集合
* 在插入文档时必须存在两个字段:existsFiledName1和existsFiledName2
* @param name 集合名称
* @param existsFiledName1 字段1
* @param existsFiledName2 字段2
*/
public void createCollectionWithFilter(String name,String existsFiledName1,String existsFiledName2){
ValidationOptions validationOptions = new ValidationOptions().validator(
Filters.or(Filters.exists(existsFiledName1), Filters.exists(existsFiledName2))
);
database.createCollection(name,new CreateCollectionOptions().validationOptions(validationOptions));
}
2.2、获取集合
java
public MongoCollection<Document> getCollection(String name){
return database.getCollection(name);
}
2.3、删除集合
java
/**
* 删除集合
*/
public void dropCollection(String collectionName){
MongoCollection<Document> collection = getCollection(collectionName);
collection.drop();
}
3、Java 操作文档
3.1、插入单个文档
java
/**
* 插入一个文档
* 创建一个文档对象,参数可以接收键值对,也可以直接接收一个Map对象
* 文档对象的本质是BSON类型,还类型对应java中的Map,BSON数组对应Java中的List
* Document.append(String key,Object value); 键指的是字段名 值可以是字符串可以是Document对象或者List数组
*/
public void insertDocument(String collectionName,Map<String,Object> map){
Document doc = new Document();
for (String key : map.keySet()) {
doc.append(key,map.get(key));
}
MongoCollection<Document> collection = getCollection(collectionName);
collection.insertOne(doc);
}
3.2、插入多个文档
java
/**
* 插入多个文档
*/
public void insertDocuments(String collectionName,List<Document> documents){
MongoCollection<Document> collection = getCollection(collectionName);
collection.insertMany(documents);
}
3.3、修改单个文档
这里用的是 Filters.eq() 相当于判断是否等于,如果有数值型的字段,可以用Filters.lt() 表示小于、Filters.gt() 表示大于...
java
/**
*
* @param collectionName 集合名称
* @param conditionFiledName 查询条件字段名
* @param value 查询条件字段对应的值
* @param updateList 更新后的字段键值对列表 注意:这里需要传入一个List<Document>集合,其中,Document对象的key应该为"$set",值为新的Document对象
*/
public void updateDocument(String collectionName,String conditionFiledName,String value,List<Document> updateList){
MongoCollection<Document> collection = getCollection(collectionName);
collection.updateOne(Filters.eq(conditionFiledName,value),updateList);
}
3.4、修改多个文档
java
//修改多个文档 所有订单数量<100的订单全部+1
MongoCollection<Document> collection = getCollection("orders");
//给满足条件的订单的订单数目全部+100
UpdateResult updateResult = collection.updateMany(Filters.eq("order_nums",100), Updates.inc("order_nums", 100));
System.out.println(updateResult.getModifiedCount());
3.5、删除文档
java
//删除单个条件文档
MongoCollection<Document> collection = getCollection("orders");
collection.deleteOne(Filters.eq("order_id","0003"));
//删除多个满足条件文档
collection.deleteOne(Filters.eq("order_num","100"));
4、Java 查询文档
4.1、查询所有文档
java
MongoCollection<Document> collection = getCollection("students");
//查询所有文档
MongoCursor<Document> cursor = collection.find().iterator();
// MongoCursor<Document> cursor = collection.find().limit(100);//只看前100行
// MongoCursor<Document> cursor = collection.find().first();//只看第一行
try {
while (cursor.hasNext()) {
System.out.println(cursor.next().toJson());
}
}finally {
cursor.close();
}
4.2、条件查询
主要依靠Filters类进行拦截过滤。
java
//多条件查询 60<=score<80 并且 address="山西"(如果address是数组,则"山西"包含在内即可)
FindIterable<Document> documents = collection.find(
new Document("score", new Document("$gte", 60)
.append("$lt", 80))
.append("address", "山西")
);
//等价于上面的
collection.find(Filters.and(
Filters.gte("score",60),
Filters.lt("score",80),
Filters.eq("address","山西")));
4.3、投影
投影就是选择展示的字段,因为默认是全部展示的。即使设置了想要展示的字段,"_id"字段也会被展示,需要用专门指定"_id"为0或者使用 Projections.excludeId()。
java
//投影
collection.find(
Filters.eq("name","李大喜")
).projection(new Document("name",1)
.append("sex",1)
.append("age",1)
.append("_id",0)
);
//等价于上面的投影 Projections.excludeId() 不展示 _id
collection.find(
Filters.eq("name","李大喜"))
.projection(Projections.fields(Projections.include("name","sex","age"),Projections.excludeId()));
4.4、排序
java
//排序 先按照年龄排序 年龄一样的安照工资排序
//asc 升序
//desc 降序
collection.find(Filters.lt("age",50))
.sort(Sorts.ascending("age","sal"));