Mongo配置使用

在这里插入图片描述
一致性(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操作, 可以根据实际情况自己选择

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值