一、添加MongoDB可视化工具(MongoDB Compass)
- 添加链接
- 创建、删除数据库
进入页面之后,点击CREATE DATABASE,创建数据库。
例如:创建数据库test,并且创建一个集合users,如下:
然后点击CREATE DATABASE后,数据库test就建立了。
-
删除数据库
选中左侧test数据库,会出现增加数据库集合、删除数据库两个按钮,选择删除按钮。 -
其他功能介绍
1、Explain Plan
在MongoDB shell中有explain()函数,用于检测诊察数据的运行情况, Explain Plan也具有相同的功能,评估查询的性能,
一般应用在find()函数查询中,评估索引等。
2、Indexes
在Indexes中,可以观测出相对应的集合的索引情况,也可以创建索引,其中索引“id”是系统中规定的唯一索引,不可删除。
其他建立的索引可以进行增删改查。
二、JAVA相关API
1、jar包依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.6.1</version>
</dependency>
2、插入
@Test
public void testInsert(){
MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);
// 获取指定数据库
MongoDatabase database = mongoClient.getDatabase("test");
// 获取指定集合
MongoCollection<Document> collection = database.getCollection("users");
// 创建需要插入的单个文档
Document doc = new Document("name", "MongoDB")
.append("type", "database")
.append("count", 1)
.append("versions", Arrays.asList("v3.2", "v3.0", "v2.6"))
.append("info", new Document("x", 203).append("y", 102));
// 测试插入
collection.insertOne(doc);
// 测试插入多个文档
ArrayList<Document> documents = new ArrayList<Document>();
for (int i = 0; i < 100; i++) {
documents.add(new Document("i",i));
}
collection.insertMany(documents);
mongoClient.close();
}
3、修改
@Test
public void test3(){
MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);
// 获取指定数据库
MongoDatabase database = mongoClient.getDatabase("test");
// 获取指定集合
MongoCollection<Document> collection = database.getCollection("users");
// update t_user set i = 110 where i = 10
//UpdateResult updateResult = collection.updateOne(new Document("i", 10), new Document("$set", new Document("i", 110)));
// update t_user set i =10 where i < 20
// lt(key,value) 静态导入 import static com.mongodb.client.model.Filters.lt;
collection.updateMany(lt("i",20),new Document("$set",new Document("i",10).append("test","test value")));
mongoClient.close();
}
4、删除
@Test
public void test4(){
MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);
// 获取指定数据库
MongoDatabase database = mongoClient.getDatabase("test");
// 获取指定集合
MongoCollection<Document> collection = database.getCollection("users");
DeleteResult deleteResult = null;
//deleteResult =collection.deleteOne(eq("i", 110));
deleteResult = collection.deleteMany(lt("i", 20));
System.out.println("删除的文档数:"+deleteResult.getDeletedCount());
mongoClient.close();
}
5、查询
@Test
public void test5(){
MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);
// 获取指定数据库
MongoDatabase database = mongoClient.getDatabase("test");
// 获取指定集合
MongoCollection<Document> collection = database.getCollection("users");
// 查所有
FindIterable<Document> documents = null;
documents = collection.find();
// 条件查询 select * fromt t_user where i = 20
documents = collection.find(eq("i",20));
// select * from t_user where i <= 20
documents = collection.find(lte("i",30));
// select * from t_user where i = 30 or i = 40 or i = 50
documents = collection.find(in("i",30,40,50));
// SELECT * FROM t_user WHERE i = 50 OR i < 25
documents = collection.find(or(new Document("i",50),lt("i",25)));
// 模糊查询 参数二:模糊条件
documents = collection.find(regex("test","test"));
// 排序 SELECT * FROM t_user WHERE i >= 90 order by i desc
documents = collection.find(gt("i",90)).sort(Sorts.descending("i"));
// 分页查询
documents = collection.find().skip(50).limit(10);
for (Document document : documents) {
System.out.println(document);
}
mongoClient.close();
}
三、SpringBoot集成MongoDB
因为我们每次在使用MongoDB时,每次都需要手动的去开启连接,关闭连接,这样在使用的时候就感觉很麻烦并且不友好,每次都需要关心连接问题,所以我们在后续的时候把MongoDB连接配置问题直接交给Spring去管理,我们只需要关注与业务发展就行,这样也大力的解放了开发难度。
1、POM配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2、基础配置application.yml(application.properties):
3、注解说明
@Document
标注在实体类上,与hibernate异曲同工。
@Document(collection=“users”)
public class User implements Serializable{
private static final long serialVersionUID = 1L;
…省略代码
@CompoundIndex
复合索引,加复合索引后通过复合索引字段查询将大大提高速度。
@Document(collection=“users”)
@CompoundIndexes({
@CompoundIndex(name = “age_idx”, def = “{‘name’: 1, ‘age’: -1}”)
})
public class Users implements Serializable{
private static final long serialVersionUID = 1L;
…省略代码
@Id
MongoDB默认会为每个document生成一个 _id 属性,作为默认主键,且默认值为ObjectId,可以更改 _id 的值(可为空字符串),但每个document必须拥有 _id 属性。
当然,也可以自己设置@Id主键,不过官方建议使用MongoDB自动生成。
@Indexed
声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。
唯一索引的话是@Indexed(unique = true)。
也可以对数组进行索引,如果被索引的列是数组时,mongodb会索引这个数组中的每一个元素。
@Indexed
private String uid;
@Transient
被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性。
@Transient
private String address;
@Field
代表一个字段,可以不加,不加的话默认以参数名为列名。
@Field(“firstName”)
private String name;
- 例如:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "users")
public class User implements Serializable {
private static final long serialVersionUID = -1369148652554782331L;
@Id
private String uid;
private String name;
private Integer age;
private String address;
}
import com.example.demo.entity.User;
import java.util.List;
public interface UserService {
void saveUser(User user);
User findUserById(String id);
List<User> findAllUsers();
void deleteUser(User user);
void updateUser(User user);
}
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public void saveUser(User user) {
mongoTemplate.save(user);
}
@Override
public User findUserById(String id) {
Query query = new Query(Criteria.where("_id").is(id));
User user = mongoTemplate.findOne(query, User.class);
return user;
}
@Override
public List<User> findAllUsers() {
List<User> list = mongoTemplate.findAll(User.class);
return list;
}
@Override
public void deleteUser(User user) {
mongoTemplate.remove(user);
}
@Override
public void updateUser(User user) {
Query query = new Query(Criteria.where("_id").is(user.getUid()));
Update update = new Update();
if (!StringUtils.isBlank(user.getName())) {
update.set("name", user.getName());
}
if (null != user.getAge()) {
update.set("age", user.getAge());
}
if (!StringUtils.isBlank(user.getAddress())) {
update.set("address", user.getAddress());
}
mongoTemplate.updateFirst(query, update, User.class);
}
}
- 保存
//保存
User user = new User();
//当需要自定义id主键时就设置对象id
//user.setUid(UUID.randomUUID().toString());
user.setName("张三");
user.setAge(11);
user.setAddress("北京");
userService.saveUser(user);
- 删除
//删除 by id
User user = new User();
user.setUid("5eedee10a374a970719351df");
userService.deleteUser(user);
- 更新
User user = new User();
user.setUid("5eedeeeb0485b0672c619b3a");
user.setAge(20);
userService.updateUser(user);
- 查询
Query query = new Query();
//查全部
Criteria criteria = Criteria.where("age").gte(1);
// //条件查询
// Query query = new Query(Criteria.where("age").gte(10));
// //模糊查询
// Query query = new Query(Criteria.where("address").regex("京"));
// //排序
// query.with(Sort.by(Sort.Order.desc("age")));
//分页
//设置起始数 (currentPage - 1) * pageSize
query.skip(0);
//设置每页查询条数pageSize
query.limit(2);
query.with(Sort.by(Sort.Order.desc("age")));
List<User> list = mongoTemplate.find(query, User.class);
// 查询记录总数
int count = (int) mongoTemplate.count(query, User.class);
// 数据总页数
//int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
list.forEach( u -> System.out.println(u));
- 批量保存
//批量操作
// BulkOperations.BulkMode.UNORDERED 和 BulkOperations.BulkMode.ORDERED的区别:
// UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;
// ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。
//插入
List<User> list = Arrays.asList(
new User("", "赵六", 20, "武汉"),
new User("", "凌达", 18, "上海")
);
//方式一
//mongoTemplate.insert(list, User.class);
//方式二
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "users");
operations.insert(list);
BulkWriteResult result = operations.execute();
- 批量更新
//先查询符合条件的数据,然后将符合条件的数据批量更新
Criteria cc = Criteria.where("visitRoomNum").is(passengerInfo.getRoomCode())
.and("visitName").is(passengerInfo.getName()).and("hotelUid").is(passengerInfo.getHotelUid());
Query qu = new Query(cc);
log.info("qu:" + qu);
List<PassengerInfo> list = mongoTemplate.find(qu, PassengerInfo.class);
Update u = new Update();
u.set("orderNum", passengerInfo.getOrderNum()).set("visitRoomNum", changRoomDTO.getRoomCode());
BulkOperations ops = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, PassengerInfo.class);
BulkOperations bulkOperations = ops.updateMulti(qu, u);
BulkWriteResult execute = bulkOperations.execute();