目录
【MongoDB简介】
MongoDB 类似 memcached和redis,都是kv数据库,mongodb 是文档数据库,存储的是文档。
特点:内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过JS语法来操作。
应用场景:一般可以把具有不同属性的商品信息存储到MongoDB。
MongoDB的优缺点:
Mongodb优点:①弱一致性(最终一致),更能保证用户的访问速度;②文档结构的存储方式,能够更便捷的获取数据;③内置GridFS,支持大容量的存储;④内置Sharding;⑤第三方支持丰富;⑥性能优越。
Mongodb缺点:①不支持事务操作。
在扩展性方面,MongoDB 在设计之初就考虑到了分布式和大数据存储的场景。具体来说,MongoDB有三个扩展性方面的特性:
- 其一是 Replica,也叫做副本集,可以理解为主从分离,也就是通过将数据拷贝成多份来保证当主挂掉后数据不会丢失。当然MySQL也有这样的设计。
- 其二是 Shard,也叫做分片,可以理解为分库分表,即将数据按照某种规则拆分成多份,存储在不同的机器上。
- 其三是负载均衡,就是当 MongoDB 发现 Shard 之间数据分布不均匀,会启动 Balancer 进程对数据做重新的分配,最终让不同 Shard Server 的数据可以尽量的均衡。当Shard Server 存储空间不足需要扩容时,数据会自动被移动到新的 Shard Server 上,减少了数据迁移和验证的成本。
【mongodb的安装】
1: 下载mongodb www.mongodb.org 下载最新的stable版
2: 解压文件

3: 不用编译,本身就是编译后的二进制可执行文件.


3.1 移动到 /usr/local/mongodb 目录下:

4: 启动mongod服务
./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017
./bin/mongod --dbpath /home/m17/ --logpath /home/mlog/m17.log --fork --port 27017
需要提前创建好对应的目录:

查看启动是否成功:

参数解释:
--dbpath 数据存储目录
--logpath 日志存储目录
--port 运行端口(默认27017)
--fork 后台进程运行
4.1 连接mongodb: ./bin/mongo 命令即可。

5: mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,如果你用虚拟机练习,可能空间不够,导致无法启动.可以用 --smallfiles 选项来启动, 将会占用较小空间 400M左右.
【mongo基础命令 】
1.1: show dbs 查看当前的数据库

1.2 use databaseName 选库

1.2 show tables/collections 查看当前库下的表/collection
![]()
1.2 查看帮助 db.help()

1.3 如何创建库?
Mongodb的库是隐式创建,你可以use 一个不存在的库,然后在该库下创建collection,即可创建库。

1.4 db.createCollection(‘collectionName’) 创建collection

1.5 collection允许隐式创建
Db.collectionName.insert(document);
db.goods.insert({_id:1,name:'NOKIA',price:29.9});

1.6 删除collection: db.collectionName.drop();

1.7 删除database: db.dropDatabase();
【添加数据】
mongodb存储的是文档(文档是json格式的对象)
语法: db.collectionName.isnert(document);
1: 增加单篇文档
Db.user.insert({title:’nice day’});

2: 增加单个文档,并指定_id
Db.user.insert({_id:8,age:78,name:’lisi’});

3.增加一个其他格式的文档
db.user.insert({_id:3,name:'hmm',hobby:['basketball','football'],intro:{'title':'My intro',content:'from china'}});

4.增加多个文档
db.collectionName.insert([
{time:'friday',study:'mongodb'},
{_id:9,gender:'male',name:'QQ'}
])

【删除数据】
语法: db.collection.remove(查询表达式, 选项);
选项是指 {justOne:true/false},是否只删一行, 默认为false
1: 查询表达式依然是个json对象
2: 查询表达式匹配的行,将被删掉.
3: 如果不写查询表达式,collections中的所有文档将被删掉.
例1: db.stu.remove({sn:’001’}); #删除stu表中 sn属性值为’001’的文档
例如:删除user表中 name值为“lisi”的数据:

如果要删除某个表中的所有数据,使用 db.user.remove(); 相当于MySQL的delete from user; 这样的操作很危险!
在test库中增加stu表,并插入一些数据:
db.stu.insert([{name:'songjiang',gender:'m'},{name:'dalang',gender:'m'},{name:'jinlian',gender:'f'},{name:'poxi',gender:'f'}]);

例2.1: db.stu.remove({gender:’f’}); #删除stu表中gender属性为f的文档,会删除所有符合条件的.

例2.2: db.stu.remove({gender:’m’},true); #删除stu表中gender属性为m的文档,只删除1行.

【修改操作】
改谁? --- 查询表达式
改成什么样? -- 新值 或 赋值表达式
操作选项 ----- 可选参数
语法: db.collection.update(查询表达式,新值,选项option);
例: db.news.update({name:'QQ'},{name:'MSN'}); 是指选中news表中,name值为QQ的文档,并把其文档值改为{name:’MSN’},
[测试] 尝试将上面仅有的一条记录中的“dalang”改成 “wudalang”,但是结果却发现“gender”字段不见了!
db.stu.update({name:'dalang'},{name:'wudalang'});

结果: 文档中的其他列也不见了,改后只有_id和name列了. 即:新文档直接替换了旧文档,而不是修改。
◆ 如果是想修改文档的某列,可以用$set关键字
db.collectionName.update(query,{$set:{name:’QQ’}})
[备注]为了方便测试,恢复之前的4条数据。

然后将最后一行的“poxi”改为 “yanpoxi”
db.stu.update({name:'poxi'},{$set:{name:'yanpoxi'}});

修改时的赋值表达式
$set 修改某列的值
$unset 删除某个列
$rename 重命名某个列
$inc 增长某个列
$setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段(2.4以上版本的Mongodb才可用).
为了测试上面的几种情况,添加如下数据:
db.stu.insert({name:'wukong',jingu:true,sex:'m',age:500});

接下来,执行多种修改操作:
db.stu.update({name:'wukong'}
{
$set:{name:'dzsf'},
$unset:{jingu:1},
$rename:{sex:'gender'},
$inc:{age:16}
});

◆ 选项Option的作用: {upsert:true/false,multi:true/false}
multi: 是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)
例:db.news.update({age:21},{$set:{age:22}},{multi:true}); #则把news中所有age=21的文档,都修改
[案例演示]将所有的gender的’m' 改为 ‘man’,修改多行:db.stu.update({gender:'m'},{$set:{gender:'male'}},{multi:true});

upsert 是指没有匹配的行,则直接插入该行,若有则更新.(和mysql中的replace into 一样)
例:db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'}},{upsert:true}); #如果有name=’wuyong’的文档,将被修改;如果没有,将添加此新文档

◆ $setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段(2.4以上版本的Mongodb才可用).
例:db.stu.update({name:'wusong'},{$set:{name:'xingzhewusong'},$setOnInsert:{gender:'male'}},{upsert:true});
#没有’wusong’的文档被修改,因此直接插入该文档,并且插入时加入gender字段

关于insert和update的说明:

Update时可用的操作符,例:
->db.user.insert({name:'lisi',age:12,sex:'male',height:123,area:'haidian'});
->db.user.update({name:'lisi'},{$set:{area:'chaoyang'},$unset:{height:1},$inc:{age:1},$rename:{sex:'gender'}});
> db.user.find();
{ "_id" : ObjectId("51fc01c4f5de93e1f2856e33"), "age" : 13, "area" : "chaoyang", "gender" : "male", "name" : "lisi" }
$setOnInsert ->相当于mysql中的列的默认值
【查找操作】
语法:
db.collection.find(查询表达式,查询的列);
Db.collections.find(表达式,{列1:1,列2:1});
例1:db.stu.find(); #查询所有文档 所有内容
例2: db.stu.find({},{gendre:1}); #查询所有文档,的gender属性 (_id属性默认总是查出来)

例3: db.stu.find({},{gender:1, _id:0}); #查询所有文档的gender属性,且不查询_id属性

例4: db.stu.find({gender:’male’},{name:1,_id:0}); #查询所有gender属性值为male的文档中的name属性

【导出与导入json和csv格式】
导入/导出可以操作的是本地的mongodb服务器,也可以是远程的。所以都有如下通用选项:
-h host 主机
--port port 端口
-u username 用户名
-p passwd 密码
mongoexport 导出json和csv格式的文件。
-d 库名
-c 表名
-f field1,field2...列名
-q 查询条件
-o 导出的文件名
--csv 导出csv格式(便于和传统数据库交换数据)
例:导出shop库的stu表的sn、name字段,并且是sn<=1000的记录。注: _id列总是导出
./bin/mongoexport -d shop -c stu -f sn,name -q '{sn:{$lte:1000}}' -o ./shop.stu.txt

导出为csv 格式:加上 --csv 即可。可以用Excel打开
./bin/mongoexport -d shop -c stu -f sn,name -q '{sn:{$lte:1000}}' --csv -o ./shop.stu.txt

mongoimport 导入json和csv
-d 待导入的数据库
-c 待导入的表(不存在会自己创建)
--type csv/json(默认是json)
--file 备份文件路径
例:将刚才导出的json格式导入到test库的animal表。
./bin/mongoimport -d test -c animal --type json --file ./shop.stu.txt

将csv 格式导入,比较特别,需要加上-f sn,name (指定字段 )和 --headerline(去掉第一行)。
./bin/mongoimport -d test -c bird --type csv -f sn,name --headerline --file ./shop.stu.csv

【导出与导入二进制bson结构】
二进制备份,不仅可以备份数据,还可以备份索引, 备份数据比较小,速度快。
mongodump 导出二进制bson结构的数据及其索引信息
-d 库名
-c 表名
-f field1,field2...列名
例: mongodum -d test [-c 表名] 默认是导出到mongo下的dump目录
./bin/mongodump -d shop -c tea

如果要导出shop库的所有表,使用 ./bin/mongodump -d shop 即可!
规律:
1: 导出的文件放在以[database]命名的目录下
2: 每个表导出2个文件,分别是bson结构的数据文件, json的索引信息
3: 如果不声明表名, 导出所有的表
mongorestore 导入二进制文件
./bin/mongorestore -d test2 --directoryperdb dump/test/ (mongodump时的备份目录)

扩展:正确关闭Mongodb的命令
use admin
db.shutdownServer()
或者直接kill -15 <pid>,注意kill -9 可能会导致数据文件损坏!
说明:
在mongodb中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据.即 use admin , -->相当于进入超级用户管理模式.
mongo的用户是以数据库为单位来建立的, 每个数据库有自己的管理员.
我们在设置用户时,需要先在admin数据库下建立管理员---这个管理员登陆后,相当于超级管理员.
![]()
【MongoDB用户管理】
添加用户
[语法] db.addUser(用户名,密码,是否只读)
[备注] 第三个参数“是否只读”默认为true,也就是只读;可写的话需要设置为false.
use admin
db.addUser(‘sa’,’passwd’,false);

注意: 添加用户后,我们再次退出并登陆,发现依然可以直接读数据库?
原因: mongodb服务器启动时, 默认不是需要认证的.
要让用户生效, 需要启动Mongodb服务器时,就指定 --auth 选项.这样, 操作时,就需要认证了。
本次启动加上 --auth ,命令如下:
./bin/mongod --dbpath /home/renxing/ --logpath /home/renxing/m17.log --fork --auth
然后进入mongo, ./bin/mongo ,再使用 show dbs 就会发现报错了,权限问题。

注: 如果需要给用户添加更多的权限,可以用json结构来传递用户参数
> use test
> db.addUser({user:'guan',pwd:'111111',roles:['readWrite,dbAdmin']});

执行认证
[语法] db.auth(用户名,密码);
use admin
db.auth(‘sa’,’passwd’);

注:也可以进入某一个数据库,执行db.addUser(),相当于给这个数据库分配了一个管理员,那么这个管理员auth之后也只能访问这个数据库。
但是之前在 admin 中分配的管理员则是超级管理员,可以操作所有数据库!

修改用户密码
[语法] db.changeUserPassword(用户名, 新密码);
db.changeUserPassword('web', 'web321');

删除用户
[语法] db.removeUser(用户名);
db.removeUser('web');

MongoDB是一个文档型数据库,以其灵活性和高性能而闻名。文章详细介绍了MongoDB的安装步骤,包括下载、解压和启动服务。接着,它涵盖了基础命令,如添加、删除和修改数据,以及查询操作。此外,文章还讨论了MongoDB的扩展性特性,如副本集和分片。最后,文章阐述了MongoDB的用户管理,包括添加、认证、修改和删除用户。

1639

被折叠的 条评论
为什么被折叠?



