一致性(Consistency) (所有节点在同一时间具有相同的数据)
可用性(Availability) (保证每个请求不管成功或者失败都有响应)
分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
0. 启动MongoDB:
docker run --name mongo -p 27017:27017 -v /mnt/mongodb/data:/data/db -v /mnt/mongodb/backup:/data/backup -d mongo --auth
-v /mnt/mongodb/data:/data/db
将宿主机和mongo的数据进行映射,便于管理(可以不需要))
-v /mnt/mongodb/backup:/data/backup
对mongo的数据库进行备份
–auth
带auth启动后,进入mongo需要认证(可以不带认证启动)
接下来,我们需要进入容器的命令行去创建用户名和密码:
docker exec -it mongo mongo admin
db.createUser({ user: ‘jsmith’, pwd: ‘password’, roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ] });
use test; (创建test数据库)
db.createUser({user:“testuser”,pwd:“testpass”,roles:[“readWrite”]});
db.auth(“testuser”,“testpass”)
数据库用户角色(Database User Roles):
read:授予User只读数据的权限
readWrite:授予User读写数据的权限
数据库管理角色(Database Administration Roles):
dbAdmin:在当前dB中执行管理操作
dbOwner:在当前DB中执行任意操作
userAdmin:在当前DB中管理User
备份和还原角色(Backup and Restoration Roles):
backup
Restore
跨库角色(All-Database Roles):
readAnyDatabase:授予在所有数据库上读取数据的权限
readWriteAnyDatabase:授予在所有数据库上读写数据的权限
userAdminAnyDatabase:授予在所有数据库上管理User的权限
dbAdminAnyDatabase:授予管理所有数据库的权限
集群管理角色(Cluster Administration Roles):
clusterAdmin:授予管理集群的最高权限
clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
hostManager:管理Server
1. 安装启动MongoDB UI 管理程序:
npm install -g mongo-admin
cd C:\Users\shelley\AppData\Roaming\npm\node_modules\admin-mongo
npm start
打开localhost:1234
2. 创建数据库:
https://dotnet.ctolib.com/article/wiki/61589
2.1 创建数据库
use runoob (创建数据库)
db.test.insert({“name”:“菜鸟教程”}) (往runoob数据库的test集合中插入文档)
在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
2.2 删除数据库
db.dropDatabase()
2.3 创建集合
2.4 删除集合
db.COLLECTION_NAME.drop()
例如: db.test.drop
2.5 插入文档
db.COLLECTION_NAME.insert(document)
例如:
db.test.insert({
title: ‘MongoDB 教程’,
description: ‘MongoDB 是一个 Nosql 数据库’,
by: ‘菜鸟教程’,
url: ‘http://www.runoob.com’,
tags: [‘mongodb’, ‘database’, ‘NoSQL’],
likes: 100
})
2.6 更新文档
a. 例如:
db.col.update(
{‘title’:‘MongoDB 教程’},
{$set:{‘title’:‘MongoDB’}}
)
//必须使用$set才是更新指定field, 要不然会直接用新的json替换整个老的json
//输出信息(更新了一条数据)
WriteResult({ “nMatched” : 1, “nUpserted” : 0, “nModified” : 1 })
2.7 删除文档
2.8 查询文档
db.test.find({},{“title”:1,_id:0}).limit(2)
第一个花括号:查询条件(不填就是查询所有)
第二个花括号:显示还是不显示(只显示title字段)
db.test.find().pretty()
按json格式显示所有test中的数据
3. JAVA中使用MongoDB
3.1 Maven配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
3.2 Properties文件配置
#mongoDB连接配置
spring.data.mongodb.uri=mongodb://root:root_pwd@localhost:27017/
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=mtest
3.3 需要操作的JavaBean
package com.example.demo.model;
public class MongoUser {
//private ObjectId _id; //没有id属性, mongo会自动会这条文档创建一个_id
private String userName;
private String passWord;
public MongoUser(String name, String password) {
this.userName = name;
this.passWord = password;
}
public MongoUser() {
super();
}
public String getName() {
return userName;
}
public void setName(String name) {
this.userName = name == null ? null : name.trim();
}
public String getPassword() {
return passWord;
}
public void setPassword(String passWord) {
this.passWord = passWord == null ? null : passWord.trim();
}
// public ObjectId get_id() {
// return _id;
// }
//
// public void set_id(ObjectId _id) {
// this._id = _id;
// }
}
3.4 Mongo连接配置文件
3.4.1 新增, 删除, 查询(默认), 查询(自定义) 使用MongoRepository<T, ID>
package com.example.demo.dao.mongo;
import java.util.List;
import java.util.Map;
import org.bson.types.ObjectId;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import com.example.demo.model.MongoUser;
//这里面只写匹配mongorepository默认格式的自定义方法
public interface MongoDBRepository extends MongoRepository<MongoUser, String>{
//当需要根据实体类中的属性查询时,MongoRepository提供的方法已经不能满足,我们需要在PersonRepository仓库中定义方法,定义方法名的规则为:find + By + 属性名(首字母大写),它会自动根据name查询
public List<MongoUser> findByUserName(String name);
//当需要根据实体类中的属性进行模糊查询时,我们也需要在PersonRepository仓库中定义方法,模糊查询定义方法名的规则为:find + By + 属性名(首字母大写) + Like,如:根据姓名进行模糊查询Person
public List<MongoUser> findByUserNameLike(String name);
@Query(value="{'name':?0}",fields="{'name':1}")
public Page<MongoUser> findByUserNameLike(String name,Pageable pageable);
public void deleteByUserName(String name);
/**
* 根据传入值修改
* @param queryFieldMap key:查询条件的属性 value:对应的属性值
* @param updateFieldMap key:需要更新的属性 value:对应的属性值
*/
//public void update(Map<String, Object> queryFieldMap, Map<String, Object> updateFieldMap);
//单个值查询,然后更新单个值
// public void update(String search, String value);
}
3.4.2 更新使用MongoTemplate
接口
package com.example.demo.service;
public interface MongoUserService {
//public void updateByvalue(Map<String, Object> queryFieldMap, Map<String, Object> updateFieldMap);
public void updateByvalue(String search, String value);
}
实现类
package com.example.demo.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
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 com.example.demo.model.MongoUser;
import com.example.demo.service.MongoUserService;
@Service
public class MongoUserServiceImpl implements MongoUserService {
@Autowired
private MongoTemplate mt;
@Override
public void updateByvalue(String searchname, String setpassword) {
mt.updateFirst(new Query(new Criteria("userName").is(searchname)),new Update().set("passWord", setpassword), MongoUser.class);
}
}
3.5 Mongo Controller接口
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.dao.mongo.MongoDBRepository;
import com.example.demo.model.Area;
import com.example.demo.model.MongoUser;
import com.example.demo.service.AreaService;
import com.example.demo.service.impl.MongoUserServiceImpl;
import java.util.List;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
@RestController
@RequestMapping("/mongo")
public class MongoController {
@Autowired
private MongoDBRepository mongodb;
@Autowired
private MongoUserServiceImpl musi;
@RequestMapping(value = "/getall",method=RequestMethod.GET)
public List<MongoUser> getAll() {
List<MongoUser> mg = mongodb.findAll();
return mg;
}
@RequestMapping(value = "/getByName",method=RequestMethod.GET)
public List<MongoUser> getByName(@RequestParam(value="name") String name) {
List<MongoUser> mg = mongodb.findByUserName(name);
return mg;
}
@RequestMapping(value = "/getByNameLike",method=RequestMethod.GET)
public List<MongoUser> queryByFirstNameLike(String name) throws Exception {
return mongodb.findByUserNameLike(name);
}
@RequestMapping(value ="/updateMongoByName",method=RequestMethod.PUT)
public void updateMongoByName(@RequestParam(value="searchname") String searchname,@RequestParam(value="setpassword") String setpassword) {
musi.updateByvalue(searchname, setpassword);
}
@RequestMapping(value ="/deleteUserByName",method=RequestMethod.DELETE)
public void deleteAreaInfo(@RequestParam(value="name") String name) {
mongodb.deleteByUserName(name);
}
@RequestMapping(value ="/insertMongo",method=RequestMethod.POST)
public MongoUser insertUserInfo(@RequestParam(value="id",required=false) String id,@RequestParam(value="name") String name,@RequestParam(value="password",required=false) String password) {
MongoUser mongouser = new MongoUser();
mongouser.setName(name);
mongouser.setPassword(password);
MongoUser mg = mongodb.insert(mongouser);
return mg;
}
}
3.6 Postman发送接口
新增:
http://localhost:8092/mongo/insertMongo?name=bob&password=qqqqq
更新:
http://localhost:8092/mongo/updateMongoByName?searchname=bob&setpassword=baidu
查询:
http://localhost:8092/mongo/getByNameLike?name=bob
4. 其他
(一)、MongoRepository
1.使用Spring Data MongoDb Repository可以使你不用写相关的查询组合语句,它会内部为我们实现这样的一个类。
2.只要你按规定定义好接口名就可以免去你写查询组合语句。
3.要有主键值才可以用save(有就更新,没有就插入)。所以就算没有ID也增加这个字段是好的。(id要是String才会自动为你生面ID号(保存时可以没有值),int 要你自己做惟一处理和输入值)
4.DATE不能作为主键使用。
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法
public interface Repository<T, ID extends Serializable> { }
Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。
与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性,两种方式没有区别。
Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
MongoRepository: 继承 PagingAndSortingRepository,实现一组 mongodb规范相关的方法
自定义的 XxxxRepository 需要继承 MongoRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力(CURD的操作功能)。
MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。
(二)、MongoTemplate
MongoTemplate是数据库和代码之间的接口,对数据库的操作都在它里面。
1.MongoTemplate实现了interface MongoOperations。
2.MongoDB documents和domain classes之间的映射关系是通过实现了MongoConverter这个interface的类来实现的。
3.MongoTemplate提供了非常多的操作MongoDB的方法。 它是线程安全的,可以在多线程的情况下使用。
4.MongoTemplate实现了MongoOperations接口, 此接口定义了众多的操作方法如"find", “findAndModify”, “findOne”, “insert”, “remove”, “save”, “update” and "updateMulti"等。
5.MongoTemplate转换domain object为DBObject,缺省转换类为MongoMappingConverter,并提供了Query, Criteria, and Update等流式API。
MongoTemplate核心操作类:Criteria和Query
Criteria类:封装所有的语句,以方法的形式查询。
Query类:将语句进行封装或者添加排序之类的操作。
2种方法都提供CRUD操作, 可以根据实际情况自己选择