mongodb

下载安装

https://www.mongodb.com/try/download/communityspringboot MongoDB uri多库 mongodb整合springboot_数据

将压缩包上传至服务器后开始安装

1、解压

tar -xvf mongodb-linux-x86_64-rhel80-4.4.2.tgz

2、移动到/usr/local/mongodb里面

mv mongodb-linux-x86_64-rhel80-4.4.2 /usr/local/mongodb

3、新建目录

#数据存储目录
mkdir -p /mongodb/single/data/db
#日志存储目录
mkdir -p /mongodb/single/log

4、修改配置文件

vi /mongodb/single/mongod.conf
systemLog:
  destination: file
  path: "/mongodb/single/log/mongodb.log"  #日志路径
  logAppend: true  #日志追加
storage:
  dbPath: "/mongodb/single/data/db"
  journal:
    enabled: true
processManagement:
  fork: true
net:
  bindIp: localhost,172.30.86.103
  port: 27017

5、启动服务

/usr/local/mongodb/mongodb-linux-x86_64-rhel80-4.4.2/bin/mongod -f /mongodb/single/mongod.conf

启动成功打印如下:

about to fork child process, waiting until server is ready for connections.
forked process: 867280
child process started successfully, parent exiting

6、连接

./mongo ip

compass图形化界面

https://www.mongodb.com/try/download/compassspringboot MongoDB uri多库 mongodb整合springboot_字段_02

解压就能直接使用

springboot MongoDB uri多库 mongodb整合springboot_字段_03

操作命令

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

数据库相关命令:

use test #选中或者创建test数据库
db #查看当前数据库
show dbs #查看所有数据库
db.dropDataBase() #删除选中的数据库

集合相关命令:

show collections #查看当前数据库所有集合
db.createCollection("hello") #显示的创建hello集合
db.hello1.drop() #删除hello1集合

插入文档:

db.hello1.insert({name: "xiaozhu"}) #插入文档
db.hello1.save({name: "xiaozhu"}) #插入文档
db.hello1.insertOne({name: "xiaozhu"}) #插入一条文档
db.hello1.insertMany([{name: "xiaozhu1"},{name:"xiaozhu2"}]) #插入多条文档

数据(网上借鉴,难得打)

db.comment.insertMany([{"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-08-05T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"},{"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开水,冬天喝温开水","userid":"1005","nickname":"伊人憔悴","createdatetime":new Date("2019-08-05T23:58:51.485Z"),"likenum":NumberInt(888),"state":"1"},{"_id":"3","articleid":"100001","content":"我一直喝凉开水,冬天夏天都喝。","userid":"1004","nickname":"杰克船长","createdatetime":new Date("2019-08-06T01:05:06.321Z"),"likenum":NumberInt(666),"state":"1"},{"_id":"4","articleid":"100001","content":"专家说不能空腹吃饭,影响健康。","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-08-06T08:18:35.288Z"),"likenum":NumberInt(2000),"state":"1"},{"_id":"5","articleid":"100001","content":"研究表明,刚烧开的水千万不能喝,因为烫嘴。","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-08-06T11:01:02.521Z"),"likenum":NumberInt(3000),"state":"1"}])

更新文档:

db.collection.update(
   <query>, #查询
   <update>, #修改
   {
     upsert: <boolean>,#可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
     multi: <boolean>,#可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
     writeConcern: <document>#可选,抛出异常的级别。
   }
)

db.comment.update({_id:"1"},{likenum:NumberInt(1001)}) #这种更新就直接覆盖掉其他字段
db.comment.update({_id:"2"},{$set:{likenum:NumberInt(889)}}) #这种更新就直接更新修改的字段
db.comment.update({userid:"1003"},{$set:{nickname:"凯撒大帝"}},{multi:true}) #修改多条记录,不加参数默认修改一条
db.comment.update({_id:"3"},{$inc:{likenum:NumberInt(1)}}) #对3号数据的点赞数,每次递增1

删除文档:

db.collection.remove(
   <query>, #查询
   {
     justOne: <boolean>,#(可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
     writeConcern: <document>#(可选)抛出异常的级别。
   }
)

db.comment.remove({_id:"1"}) #删除_id为1的数据

查询文档:

db.collection.find(
	<query>, #查询条件
	[projection] #投影字段
)

db.comment.find() #查询所有数据  db.comment.find().pretty()会格式化展示数据
db.comment.find({}) #查询所有数据
db.comment.find({userid:'1003'}) #查询userid为1003的数据
db.comment.findOne({userid:'1003'}) #查询userid为1003的第一条数据
db.comment.find({userid:"1003"},{userid:1,nickname:1}) #查询userid为1003的第一条数据,只展示userid,nickname字段,_id是默认的主键,会默认显示
db.comment.find({userid:"1003"},{userid:1,nickname:1,_id:0}) #不显示_id
db.collection.count(query, options) #查询数量 db.comment.count({userid:"1003"})查询userid为1003的数量
db.comment.find().skip(3).limit(2) #分页查询
db.comment.find().sort({userid:1}) #sort()排序,使用字段,后面跟-1或者1,其中-1表示降序,1表示升序,需要多个字段排序就加多个字段
#skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关
db.comment.find({userid:/正则表达式/}) #使用正则表达式查询
db.comment.find({userid:{$in:["1003","1004"]}}) #包含查询,相当于sql中的in()
#$and:[ { },{ },{ } ]
#$or:[ { },{ },{ } ]

操作

格式

范例

RDBMS中的类似语句

等于

{<key>:<value>}

db.comment.find({"by":"xxx"}).pretty()

where by = 'xxx'

小于

{<key>:{$lt:<value>}}

db.comment.find({"likes":{$lt:50}}).pretty()

where likes < 50

小于或等于

{<key>:{$lte:<value>}}

db.comment.find({"likes":{$lte:50}}).pretty()

where likes <= 50

大于

{<key>:{$gt:<value>}}

db.comment.find({"likes":{$gt:50}}).pretty()

where likes > 50

大于或等于

{<key>:{$gte:<value>}}

db.comment.find({"likes":{$gte:50}}).pretty()

where likes >= 50

不等于

{<key>:{$ne:<value>}}

db.comment.find({"likes":{$ne:50}}).pretty()

where likes != 50

索引

mongodb有单字段索引,多字段索引,地理空间索引,文本索引,哈希索引

db.collection.getIndexes() #查看索引

db.collection.createIndex(keys, options)
db.comment.createIndex({userid:1}) #创建索引,1表示升序,-1表示降序,对于单字段索引升序降序没有影响

db.collection.dropIndex(index)
db.collection.dropIndex({userid:1})  #删除索引
db.collection.dropIndexes() #删除所有的索引,_id是默认索引,无法删除

执行计划

db.collection.find(query,options).explain(options) #查看执行计划
db.comment.find({nickname:"伊人憔悴"}).explain()
{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.comment",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"nickname" : {
				"$eq" : "伊人憔悴"
			}
		},
		"queryHash" : "581B52D4",
		"planCacheKey" : "581B52D4",
		"winningPlan" : {
			"stage" : "COLLSCAN",     #COLLSCAN表示全表扫描
			"filter" : {
				"nickname" : {
					"$eq" : "伊人憔悴"
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"serverInfo" : {
		"host" : "xiaozhu",
		"port" : 27017,
		"version" : "4.4.2",
		"gitVersion" : "15e73dc5738d2278b688f8929aee605fe4279b0e"
	},
	"ok" : 1
}
db.comment.find({userid:"1003"}).explain()
{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.comment",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"userid" : {
				"$eq" : "1003"
			}
		},
		"queryHash" : "37A12FC3",
		"planCacheKey" : "7FDF74EC",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",      #IXSCAN表示基于索引的查询
				"keyPattern" : {
					"userid" : 1
				},
				"indexName" : "userid_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"userid" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"userid" : [
						"[\"1003\", \"1003\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"serverInfo" : {
		"host" : "xiaozhu",
		"port" : 27017,
		"version" : "4.4.2",
		"gitVersion" : "15e73dc5738d2278b688f8929aee605fe4279b0e"
	},
	"ok" : 1
}

springboot整合mongodb

新建springboot模块,引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

配置mongodb

spring:
  #数据源配置
  data:
    mongodb:
      # 主机地址
      host: ***
      # 数据库
      database: test
      # 端口
      port: 27017
      #也可以使用uri连接
      #uri: mongodb://8.131.95.10:27017/test

实体类

@Setter
@Getter
@ToString
@Document(collection = "comment")
public class Comment implements Serializable {
   //主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
   @Id
   private String id;//主键
   //该属性对应mongodb的字段的名字,如果一致,则无需该注解
   @Field("content")
   private String content;//吐槽内容
   private Date publishtime;//发布日期
   //添加了一个单字段的索引
   @Indexed
   private String userid;//发布人ID
   private String nickname;//昵称
   private LocalDateTime createdatetime;//评论的日期时间
   private Integer likenum;//点赞数
   private Integer replynum;//回复数
   private String state;//状态
   private String articleid;
}

dao层

@Repository("commentDao")
public interface CommentDao extends MongoRepository<Comment,String> {
}

service层

@Service("commentService")
public class CommentService {
   @Autowired
   private CommentDao commentDao;

   public void saveComment(Comment comment){
      commentDao.save(comment);
   }
   public void updateComment(Comment comment){
      commentDao.save(comment);
   }

   public List<Comment> findAddComment(){
      return commentDao.findAll();
   }

   public Comment findCommentById(String id){
      return commentDao.findById(id).get();
   }
}

测试

@Autowired
private CommentService commentService;
@Test
void commentSave() {
   Comment comment=new Comment();
   comment.setId("11");
   comment.setContent("content");
   comment.setArticleid("11");
   comment.setCreatedatetime(LocalDateTime.now());
   comment.setLikenum(11);
   comment.setNickname("nickname");
   comment.setPublishtime(new Date());
   comment.setReplynum(11);
   comment.setState("1");
   comment.setUserid("11");
   commentService.saveComment(comment);
}
@Test
void commentUpdate() {
   Comment comment = commentService.findCommentById("10");
   System.out.println(comment);
   comment.setContent("pig");
   commentService.updateComment(comment);
   comment = commentService.findCommentById("10");
   System.out.println(comment);
}
@Test
void commentFindAdd() {
   List<Comment> list = commentService.findAddComment();
   for (Comment comment : list) {
      System.out.println(comment);
   }
}