MongoDB学习整理 【原创】

MongoDB学习整理

 

Write By CS逍遥剑仙
我的主页: www.csxiaoyao.com
GitHub: github.com/csxiaoyaojianxian
Email: sunjianfeng@csxiaoyao.com
QQ: 1724338257

1. 概述

MongoDB 是介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的,语法类似javascript面向对象的查询语言,是一个面向集合的、模式自由的文档型数据库。

文档是MongoDB中数据的基本单元,即多个键值对的有序放置,如:

{"username":"sunshine","age":"10"}
{"Username":"csxiaoyao",”age”:10}

MongoDB的文档、集合、数据库与mysql的类似对应关系如下:

MongoDB mysql
文档(document)单文档最大16M 记录(row)
集合(collection) 表(table)
数据库(database)32位系统单数据库文件大小不超过2G 数据库(database)

2. 入门语句

创建数据库

语法: use <数据库名称>

注意:若不存在,则创建;若存在,则切换;若创建数据库后没有任何操作,则自动删除。

查看数据库

语法: show dbs

创建集合

通过插入隐式创建集合

语法: db.<集合名>.insert({})

查看集合

语法: show tables

查询集合中文档

语法:

查询所有: db.<集合名>.find()

查询第一个文档: db.<集合名>.findOne()

删除集合

语法: db.<集合名>.drop()

删除数据库

语法: db.dropDatabase()

帮助命令

语法:

全局帮助命令: help

集合相关帮助命令: db.<集合名>.help()

> use sunshine  # 创建数据库
switched to db sunshine
> show dbs  # 查看数据库
admin   0.000GB
config  0.000GB
local   0.000GB
sunshine  0.000GB
> db  # 当前数据库
sunshine
> db.test.insert({'name':'csxiaoyao','age':25})  # 隐式创建集合
WriteResult({ "nInserted" : 1 })
> show tables # 查看集合
test
> db.test.find()
{ "_id" : ObjectId("5c15f7211e61c72ebf900dbf"), "name" : "csxiaoyao", "age" : 25 }
{ "_id" : ObjectId("5c15f94d1e61c72ebf900dc0"), "desc" : "csxiaoyao", "size" : 1 }
> db.test.findOne()
{
    "_id" : ObjectId("5c15f7211e61c72ebf900dbf"),
    "name" : "csxiaoyao",
    "age" : 25
}
> db.test.drop()
true
> db.dropDatabase()
{ "dropped" : "sunshine", "ok" : 1 }
> db.test.help()
......

3. 增删改查操作

添加文档

语法: db.<集合名>.insert({k1:’v1′,k2:’v2’……})

注意:

  1. 文档是键值对,数据类型是BSON,支持类型更加丰富

  2. 每个文档有一个_id字段,且同一集合中_id值唯一,该字段可以是任意类型数据,默认是一个ObjectId对象,可自己输入,但不能重复

删除文档

语法: db.<集合名>.remove({<条件>})

注意:

  1. 不写条件删除所有的文档

  2. 常用操作符:$lt, $lte, $gt, $gte ( < , <= , > , >= ), $ne ( <> ), $in, $nin, $or, $not, $mod (取模), $exists, $where

# 删除 test 集合中年龄等于5的文档 
db.test.remove({age:5})
# 删除 test 集合中年龄大于7的文档 
db.test.remove({age:{'$gt':7}})

更新文档

方法1: 直接修改

语法: db.<集合名>.update({<条件>},{<新文档>})
语法: db.<集合>.update(<条件>, <新文档>, <是否新增>, <是否修改多条>)
​ 是否新增: 若值是1(true),没有满足条件的则添加
​ 是否修改多条: 若值是1(true),满足条件的若有多个文档则都要修改

方法2: 使用修改器

$inc : 加一个数字
$set : 修改某一个字段,如果字段不存在则增加
语法: db.<集合名>.update({<条件>},{<修改器名称>:{<修改键>:<修改新值>}})

case1: 修改age=24的文档的name
db.test.update({age:24},{name:'sunshine'})

case2: 修改age=24的文档的name为csxiaoyao
db.test.update({age:24},{'$set':{name:'csxiaoyao'}})

case3: 修改age=1的文档的age加10岁
db.test.update({age:1},{$inc:{age:10}})

查询文档

语法: db.<集合名>.find({<条件>})

case1: 取出test集合里第一个文档
db.test.findOne()

case2: 取出test集合里age=2的文档
db.test.find({age:2})

case3: 取出test集合里age>2的文档
db.test.find({age:{‘$gt’:2}})

case4: 取出test集合里的文档,控制显示的键
db.test.find({},{age:1}) # 1表示只显示age键值
db.test.find({},{age:0}) # 0表示除了age键值,其余都显示

case5: 根据年龄的(降序|升序)来显示文档
db.test.find().sort({age:1})根据年龄升序 
db.test.find().sort({age:-1})根据年龄降序

case6: 显示集合中前3个文档
db.test.find().limit(3)

case7: 显示集合中第3个到第5个文档
db.test.find().skip(2).limit(3)

case8: 统计集合中文档的个数
db.test.count() 

4. 用户管理(权限控制)

mongodb里每个数据库有自己的管理员,在admin数据库中创建的用户是超级管理员,登录后可以操作任何数据库。

创建用户:

语法: (旧版)

use <数据库名>

db.addUser(<用户名>,<密码>,<只读>)

第三个参数’是否只读’默认false,创建的用户可以执行读写,如果是true则创建的用户只能查询,不能修改。

在创建用户之前,必须先创建一个超级管理员。

> use admin
> db.addUser('root','123456')
> use test
> db.addUser('sunshine','123456',true)

注意:新版改addUser为createUser,详见官方文档

验证权限(用户登录)

语法: db.auth(<用户名>,<密码>)

删除用户和修改密码

创建的用户名和密码存储在各自数据库里的system.users集合里,若想要删除用户,直接删除system.users集合里的文档即可

总结说明

(1)非admin数据库的用户不能使用数据库命令,比如show dbs等
(2)admin数据库中的用户被视为超级用户(即管理员),在认证之后,管理员可以读写所有数据库,执行特定的管理命令
(3)在开启安全检查之前,一定要至少有个管理员账号
(4)数据库的用户账号以文档的形式存储在system.users集合里面。可以在system.users集合中删掉用户账号文档,就可以删除用户

5. 索引

> for(var i=0;i<200000;i++){
... db.test.insert({name:'csxiaoyao'+i,age:i})
... }
# 先测试查询性能
var start = new Date()
db.test.find({name:'csxiaoyao12345'})
var end = new Date()
end-start

测试时间为114

5.1 普通单列索引

语法: db.<集合名>.ensureIndex({<键名>:1})

1升序, -1降序

# 为name创建索引
db.test.ensureIndex({name:1})

测试执行上述查询时间为25

5.2 多列索引(复合索引)

语法: db.<集合名>.ensureIndex({field1:1/-1, field2:1/-1})

# 对name和age建立一个复合索引
db.test.ensureIndex({name:1,age:1})

5.3 子文档索引

语法: db.<集合名>.ensureIndex({filed.subfield:1/-1})

# 文档
{name:'诺基亚手机1',price:12.34,spc:{weight:100,area:'纽约'}}
{name:'诺基亚手机2',price:22.34,spc:{weight:200,area:'伦敦'}}
# 查询weight等于100的文档
db.test.find({'spc.weight':100})
# 建立子文档索引
db.test.ensureIndex({'spc.w':1})

5.4 唯一索引

语法: db.<集合名>.ensureIndex({name:-1},{unique:true})

5.5 查询索引

# 查看当前索引状态
db.test.getIndexes()
# 详情查看本次查询使用哪个索引和查询数据的状态信息
db.test.find({name:'csxiaoyao'}).explain() 

5.6 删除索引

# 删除单个索引
db.test.dropIndex({filed:1/-1})
# 删除所有索引
db.test.dropIndexes()

5.7 重建索引

表经过很多次修改后导致表文件产生空洞,索引文件也如此,可通过索引的重建,减少索引文件碎片,提高索引的效率,类似mysql中的optimize table

mysql使用optimize table语法: optimize table <表名>

mongodb语法: db.<集合名>.reIndex()

5.8 注意事项

(1)创建索引,1是正序创建索引, -1是倒叙创建索引

(3)复合索引要注意索引的先后顺序

(5)数据量大的排序工作也可以考虑加索引来提高排序性能

6. 数据导出与导入

// 导出数据
mongoexport 
-h host主机
--port 端口
-d 指明使用的库
-c 指明要导出的集合
-o 指明要导出的文件名
--csv 指定导出的csv格式
-q 过滤导出
-f field1 field2 列名
-u username 用户名
-p password 密码

// 导入数据
mongoimport
-d 待导入数据库
-c 待导入的集合
--type csv/json(默认) 
--file 备份文件路径

【By CS逍遥剑仙】 未经允许不得转载:禅林阆苑 » MongoDB学习整理 【原创】

赞 (1) 打赏

评论 0

如果觉得有用就请我喝一杯咖啡吧

支付宝扫一扫打赏

微信扫一扫打赏