Mongo安装及基本命令

一、MongoDB介绍

MongoDB是一个基于分布式文件存储的数据库。由 C++ 语言编写,其将数据存储为一个文档,数据结构由键值对形式表示,文档型类似json对象,字段值可以包含其他文档,数组及文档数组。MongoDB存储的是Bjson类型,是二进制序列化的形式,也支持嵌套。
常用数据类型:

  • 字符串String
  • 整型数值Integer
  • 布尔值 Boolean
  • 数组 Array
  • 时间戳 Timestamp
  • 对象,内嵌文档 Object
  • 空值 Null
  • 日期时间 Date
  • 对象ID Object ID
  • 二进制数据 Binary Data
  • 代码类型 Code
  • 正则表达式 Regular expression

二、Ubuntu安装MongoDB

  1. 传统方式外部安装

tar -zxvf mongodb-linux-x86_64-ubuntu2004-6.0.1.tgz 
mv -r mongodb-linux-x86_64-ubuntu2004-6.0.1/ /usr/local/mongodb

环境变量配置 vim /etc/profile:
# set mongo dev
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin

source /etc/profile
cd /usr/local/mongodb
mkdir -p data/db
chmod 777 data/db
mkdir logs && cd logs && touch mongodb.log

# 设置启动配置
cd /usr/local/mongodb/bin 
vi mongodb.conf

插入下列内容:
dbpath = /usr/local/mongodb/data/db #数据文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目录
port = 27017 #端口
fork = true #以守护程序的方式启用,即在后台运行

启动mongod数据库服务,以配置文件的方式启动
cd /usr/local/mongodb/bin
./mongod -f mongodb.conf

安装mongodb-clients
apt install mongodb-clients

2)使用docker安装。在容器启动

docker pull mongo:版本号xxx  //拉镜像
docker run -d --name mongo --p 27017:27017 mongo:版本号xxx // 运行镜像
docker exec -it xxx bash  // 进入mongo 容器
mongo //启动mongo客户端

三、MongoDB常用命令

3.1、操作库

查看所有库
show dbs | show databases;

创建或者切换数据库  # 连接后默认进入的是test的库
use xxx;  # 库中无集合数据时,查看库时不显示

查看当前所在的库   
db

插入数据
db.users.insert({name:"jude"});

删除数据库
db.dropDatabase(); # 删除有数据的库后,show dbs不展示,db查看还是在当前库

3.2、操作集合(集合类似关系型数据库中的表,无修改操作)

查看库中所有集合
show collections | show tables;

创建集合
(显式创建,集合存在)
db.createCollection('集合名称', [options])
db.createCollection('pro',{max:100,capped:true,size:50000})

(隐式创建,集合不存在)
db.temp.insert({name:"zhangsan"});
db.emp.insert({name:"wu"})

删除集合
db.集合名称.drop();

3.3、文档相关操作(集合中最小单元) 官方文档

每条文档放入集合中时,会自动维护一个_id,也可手动指定

1、创建

a. 单条文档创建

db.users.insert({name:'zhangsan', age:13, birthday:"2017-01-02"})

b. 多条文档创建(insertMany或insert)

db.users.insertMany([{name:"wuw",age:12},{_id:1,name:"hha",age:22}])
db.users.insert([{name:"hy",age:32},{name:"word",age:14}])

c. js脚本方式创建

for(let i=3;i<9;i++){
 	db.users.insert({_id:i,name:"lili"+i,age:i+12});
} 

2、删除文档

db.集合名词.remove(<query>,{
	justone: <boolean>,
	writeConcern: <document>
}) 
可选参数:
query : 删除条件
删除的配置对象 {justone:1true删一条,false删匹配到的所有行, writeConcern:抛出的异常级别}

db.集合名词.remove({}) # 不带条件则删除所有,删除后集合还是存在的

删除下划线为1的文档记录
db.users.remove({_id:1})
db.users.remove({_id:ObjectId("632f03048e7c53ca629b7715")})

删除多条数据

3、更新

db.集合名.update(
	<query>,
	<update>, 对象或者操作符($,$inc..) 可理解为sql update查询内set后面的
	{
		upsert: <boolean>, 默认值false,不插入。true时,这条记录不存在会插入进去
		multi: <boolean>,  默认值false,多条时只更新一条,true查询匹配多条时全部更新
		writeConcern: <document>  抛出的异常级别
	}
);
query: 基于哪些条件更新  必输
update: 更新的内容  必输
更新配置对象{}: 非必输

更新时默认先将原内容删除在重新插入,不指定$set,会覆盖原内容,不保留原内容,如下图,更新后name没有了

$set 保留原来数据更新,但是只更新符合条件的第一条数据。

不更新age则保留之前的

不指定multi true,默认只更新匹配到的第一条

指定时,匹配到会全部更新

指定upsert,不存在时,则创建文档

4、文档查询

find方法以非结构化的方式显示所有文档,如果需要结构化,需要使用find().pretty(),可以以美观的格式化的显示文档
(超过一定长度才会格式化)。

db.集合名词.find().pretty()

1) 条件查询

查询年龄24的
db.users.find({age:24}) 
查询年龄小于28的
db.users.find({age:{$lt:28}})
查询年龄小于等于28的
db.users.find({age:{$lte:28}})
查询年龄大于24的
db.users.find({age:{$gt:24}})
查询年龄大于等于24的
db.users.find({age:{$gte:24}})
查询年龄不等于24的
db.users.find({age:{$ne:24}})

2) AND查询

db.集合名词.find(key1:value1, key2:value2,...).pretty()
查不到返回空
and查询时相同字段出现多次时,以后面字段为主


例:查询年龄24,名字是wul_0的
db.users.find({age:24,name:"wul_0"})

多条件查询时,同一个查询条件写多次时,后面的会覆盖前面的如:
查询年龄24的,且年龄大于等于28的,后面条件覆盖前面的会查询年龄大于等于28的
db.users.find({age:24, age:{$gte:28}})

3) OR查询

db.集合名词.find(
	{
		$or:[
			{key1:value1},{key2:value2}
		]
	}
).pretty()


例:db.users.find({$or:[{name:"wul_1"},{age:28}]})  # 查询名字是wul_1或者年龄28的
db.users.find({$or:[{name:"wul_1"},{age:{$gte:28}}]}) # 查询名字是wul_1或者年龄大于等于28的

4) AND和OR联合查询

# 查询年龄大于等于24,且名字为wul_8或wul_0的
db.users.find({age:{$gte:24},$or:[{name:"wul_8"},{name:"wul_0的"}]})

5) 数组中查询

db.users.find({likes:"music"})
{ "_id" : 11, "age" : 28, "likes" : [ "footballxx", "music", "basketball" ], "name" : "wulxx_11" }

6) $size 按数组长度查询

db.users.find({likes:{$size:3}})
{ "_id" : 11, "age" : 28, "likes" : [ "footballxx", "music", "basketball" ], "name" : "wulxx_11" }

7) 模糊查询 通过正则实现

db.users.find({name:/wu/})   名字中包含wu的

8) 排序

db.集合名称.find().sort({name:1,age:1});  # 类似order by name,age
1  升序  -1 降序

# 按年龄降序
db.users.find().sort({age:-1}) 
# 按年龄降序,按名字升序
db.users.find().sort({age:-1, name:1})

9) 分页

排序结果分页处理
db.集合名称.find().sort({条件}).skip(start).limit(rows)  # 类似于limit start, rows


# 起始条数为page-1 
db.users.find().sort({age:-1,name:1}).skip(page-1).limit(2)


# 查询总条数
db.集合名称.count()
db.orders.find({name:'order_100'}).count()  # 加在条件后计数

db.orders.find({_id:{$gt:500}}).count() 

10) 去重 ,返回去重字段的数组

db.集合名称.distinct('字段')

db.users.distinct('age')
# [ 24, 28 ]

11) 指定返回字段

db.集合名称.find({条件}, {name:1, age:1})
第二个参数,1时返回该字段,0时不返回。 0和1不能同时使用

# 只返回name字段,_id为文档的唯一标识默认会返回
db.users.find({},{name:1})

# 不返回name字段
db.users.find({},{name:0})

posted @   鱼的记忆·  阅读(241)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示