安装
- 下载地址
https://www.mongodb.com/download-center?jmp=nav#production
- 环境变量
PATH = PATH;%MONGO_PATH%
- 启动配置
mongod --dbpath=d:\mongodb\data\db --port=27017
mongod
:启动命令
dbpath
:指定文件存储地址
port
:默认就是27017
,也可以手动指定
# 指定日志
mongod --dbpath=d:\software\mongodb\data\db --logpath=d:\software\mongodb\data\log.txt
# 后台启动
mongod --dbpath=\home\software\mongodb\data\db --fork --logpath=\log\service\mongodb\log
正如看到的,windows
是没有fork
的,不能够支持后台运行。
不过设置成服务就有这个效果了,具体可以试试。
更多参数,可以mongod --help
进行查看,或者翻阅博文。
基本使用
- 数据库列表
show dbs;
- 当前数据库
db;
- 切换和创建
use godme;
有就切换, 没有就重新创建指定名称数据库。
- 删除数据库
db.dropDataBase();
删除当前数据库,删除指定数据库之前,记得
use database
。
- 创建集合
db.createCollection("collectionName")
db.*
操作都是当前,注意所处的位置。
collection
相当于MySQL
中的table
。
- 集合列表
show collections;
相当于
show tables
;
- 删除集合
db.collectionName.drop();
通过
collectionName
锁定到指定的集合,然后drop
。
- 插入数据
db.collectionName.insert({
name:"godme",
age:99,
male:"female"
})
- 插入的数据是
json
- 插入是对于表(
collection
)而言的操作- 字段名称不用引号,数字不用引号,字符串类型需要引号
- 查询数据
# 全量查询
db.collectionName.find()
# pretty自动显示,更好看
db.collectionName.find().pretty()
# find中可以插入查询条件, 按照条件查询
db.collectionName.find({name:"godme"}).pretty()
# 第二个是显示条件,筛选显示字段
db.collectionName.find({name:"godme"}, {name:0}).pretty()
关于查询条件,有两点需要补充
- 比较
{"age": {$gt:50}
针对单个属性,可以有其他筛选办法
- 并列
{{name:"godme"},{age:89}}
并列关系为
and
,必须同时满足
- 或
{$or,[{name:"godme"},{age:89}]}
$or
,表示or
关系。
- 更新数据
# 前面查询条件,后面替换
db.collectionName.update({name:"godme"}, {age:123})
# 为了只替换部分,而不是文档覆盖,需要 $set
db.collectionName.update({age:123}, {$set:{name:"godme"}})
# 默认修改匹配第一条,想要多条可以 {multi:true}
db.collectionName.update({male:"female"}, {$set:{age:18}}, {multi:true})
# save会直接覆盖原来的文档,关键save内部必须传id
dbcollectionName.save({
...
})
$set
,手动使用别忘记了,不指定就成了文档覆盖了,只不过沿用id
而已。嗯,比
save
方便些。
- 删除数据
# 移除指定条件查找到的数据
db.collectionName.remove({name:"godme"})
# 默认查到的都会进行删除,第二个参数justOne,true表示只删除匹配的第一条
db.collectionName.remove({name:"godme"}, true)
# 空条件,全匹配,清空 commection
db.collectionName.remove({})
- 字段比对
符号 | 字段 | 解释 |
---|---|---|
> | $gt | greater than |
>= | $gte | gt equal |
< | $lt | less than |
<= | $lte | lt equal |
== | eq | equal |
!= | ne | not equal |
{age : {$let : 20}} # 小于等于 20
- 正则匹配
查询 | 书写 | 解释 |
---|---|---|
{name:/GG/} | /GG/ | 包含 |
{name:/^GG/} | /^GG/ | 开头 |
{name:/GG$/} | /GG$/ | 结尾 |
正则相当于模糊查询,而且可以控制字符位置,比较不那么模糊。
- 类型过滤
db.collectionName.find({name : {$type : 'string'}})
算是筛选的一个分支,可以通过指定字段类型来进行数据的过滤
- 数量限定
db.collectionName.find({}).limit(5);
查询数据,限定五条,和
MySQL
中的limit
一个含义
db.collectionName.find({}).limit(5).skip(2);
skip
:跳过多少条。如果数据量足够的话,
find({}).limit(5)
显示的数据是0-5
,总共五条。
find({}).limit(5).skip(2)
显示的就是2-7
,仍然是五条,但是会忽略前面匹配的几条。
skip
默认忽略0
条,所以不写参数和不用效果是一致的。
- 数据排序
db.collectionName.find({},{name:1, _id: 0, age: 0}).sort({"name" : 1})
查询还记得不:查询全部的数据,只显示
name
,其他的忽略。
sort
:表示排序
{"name" : 1}
:指定需要排序的字段, 以及排序方式
数值 顺序 1 升序 -1 降序
- 数据索引
# 创建索引
db.collectionName.createIndex({name : 1})
# 复合索引
db.collectionName.createIndex({name : 1, age : -1})
# 添加选项
db.collectionName.createIndex({name : 1, age : -1}, {background : true})
添加索引时后面的
1
表示顺序,于此判断升序或降序。索引创建可以添加选项,更多可以翻阅文档。
- 聚合查询
db.collectionName.aggregate([{$group : {name : "$name", number : {$sum : 1}}}])
实际效果相当于
select name, count(*) from collectionName group by name;
$group
:表示分组
{name: "$name"}
:表示分组标记,$name
自动提取具体数值,名称指定即可。
{$sum : 1}
:聚合函数,自动计数
{number : {$sum : 1}}
:自动计数赋值给number
[]
:多个结果分组,需要声明结合
SQL
对照加深理解select name , count(*) from collectionName group by name;
更多聚合操作
符号 查询 解释 $sum
{old : {$sum : "$age"}}
求和 $avg
{age : {$avg : "$age"}}
平均 $min
{young : {$min : "$age"}}
最小 $max
{grater: {$max : "$age"}}
最大 $push
{arr : {$push : "$age"}}
添加到数组 $addToSet
{arr : {$addToSet : "$age"}}
添加到数组
不创建副本$first
{first : {$first : "$age"}}
取聚合文档第一个 $last
{last : {$last : "$age"}}
取聚合文档最后一个
管道
符号 含义 $project
修改文档结构 $match
过滤数据 $limit
限制数量 $skip
跳过数量 $unwind
拆分 $group
分组统计 $sort
排序 $geoNea
… 改名
db.article.aggregate( { $project : { _id : 0 name : 1 , age : 0 , }} );
只显示
name
。跳过
db.article.aggregate({ $skip : 5 });
跳过数据5条
筛选
db.articles.aggregate( [ { $match : { male : "female", age : { $gt : 18, $lte : 30 } } } ] );
征婚条件
性别 : 女
年龄:
18 > age and age <= 30
这个应该没问题吧。
管道
db.articles.aggregate( [ { $match : { male : "female", age : { $gt : 18, $lte : 30 } } }, { $sort : { age : 1} } ] );
筛选之后再排序,优先年轻的。
所谓
aggregate
聚合,就是相当于已经拿到了全部数据,然后依次执行定义的操作。前面操作的输出作为下一步操作的输入,原始输入为
collection
,最后一步的即是输出结果。# 类比SQL select * from (select * from beauty);
# 类比shell ps -ef | grep godme | xargs cat
所以,
aggregate
就是制定操作逻辑,然后自动顺序执行。
- 副本
- 命名
mongod --port 27017 --dbpath "D:\software\mongodb\data\db" --replSet godme
为启动的
mongo
服务设置实例名称。
- 添加
rs.add("godme:27010")
客户端连接
master
以后可以添加副本。从功能上理解,类似于主从
slave
,能够备份数据。但是更加只能,
master
宕机后副本能够接替主机,放置服务宕机。
- 其他
# 判断主备 db.isMaster() # 创建新副本 rs.initiate() # 副本配置 rs.conf() # 副本状态 rs.status()
- 备份和恢复
- 备份
mongodump -h 127.0.0.1:27017 -d godme -o /home/data/back
mongodump
:备份命令
-h
:指定连接的mongo
服务地址,ip:port
,比如127.0.0.1:27017
。
-d
:数据库名称
-o
:指定数据导出文件地址
- 恢复
mongorestore -h 127.0.0.1:27017 -d godme /home/data/back
-h
:服务地址
-d
:数据库
/home/data/back
:指定备份文件
--drop
:指定以后先清空再开始恢复,如果有重要数据切勿使用
--dir
:可以声明式指定文件位置,和path
冲突,只能使用一个。
- 监控
# 状态监控
mongostat
# top
mongotop
# top 10
mongotop 10
# 监控各实例锁占用
mongotop --locks
意思都懂,不赘述了。