mongodb
下载安装
https://www.mongodb.com/try/download/community
将压缩包上传至服务器后开始安装
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/compass
解压就能直接使用
操作命令
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中的类似语句 |
等于 |
|
|
|
小于 |
|
|
|
小于或等于 |
|
|
|
大于 |
|
|
|
大于或等于 |
|
|
|
不等于 |
|
|
|
索引
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);
}
}