版权声明:本文为CS逍遥剑仙原创文章,未经允许不得转载
Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csxiaoyaojianxian Email: sunjianfeng@csxiaoyao.com QQ: 1724338257
MongoDB 是介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的,语法类似javascript面向对象的查询语言,是一个面向集合的、模式自由的文档型数据库。
文档是MongoDB中数据的基本单元,即多个键值对的有序放置,如:
{"username":"sunshine","age":"10"}
{"Username":"csxiaoyao",”age”:10}
MongoDB的文档、集合、数据库与mysql的类似对应关系如下:
MongoDB | mysql |
---|---|
文档(document)单文档最大16M | 记录(row) |
集合(collection) | 表(table) |
数据库(database)32位系统单数据库文件大小不超过2G | 数据库(database) |
创建数据库
语法: 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()
......
添加文档
语法: db.<集合名>.insert({k1:‘v1’,k2:‘v2’……})
注意:
_id
字段,且同一集合中_id
值唯一,该字段可以是任意类型数据,默认是一个ObjectId对象,可自己输入,但不能重复
删除文档
语法: db.<集合名>.remove({<条件>})
注意:
$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()
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集合中删掉用户账号文档,就可以删除用户
> 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
语法: db.<集合名>.ensureIndex({<键名>:1}) 1升序, -1降序
# 为name创建索引
db.test.ensureIndex({name:1})
测试执行上述查询时间为25
语法: db.<集合名>.ensureIndex({field1:1/-1, field2:1/-1})
# 对name和age建立一个复合索引
db.test.ensureIndex({name:1,age:1})
语法: 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})
语法: db.<集合名>.ensureIndex({name:-1},{unique:true})
# 查看当前索引状态
db.test.getIndexes()
# 详情查看本次查询使用哪个索引和查询数据的状态信息
db.test.find({name:'csxiaoyao'}).explain()
# 删除单个索引
db.test.dropIndex({filed:1/-1})
# 删除所有索引
db.test.dropIndexes()
表经过很多次修改后导致表文件产生空洞,索引文件也如此,可通过索引的重建,减少索引文件碎片,提高索引的效率,类似mysql中的optimize table
mysql使用optimize table语法: optimize table <表名> mongodb语法: db.<集合名>.reIndex()
(1)创建索引,1是正序创建索引, -1是倒叙创建索引
(3)复合索引要注意索引的先后顺序
(5)数据量大的排序工作也可以考虑加索引来提高排序性能
// 导出数据
mongoexport
-h host主机
--port 端口
-d 指明使用的库
-c 指明要导出的集合
-o 指明要导出的文件名
--csv 指定导出的csv格式
-q 过滤导出
-f field1 field2 列名
-u username 用户名
-p password 密码
// 导入数据
mongoimport
-d 待导入数据库
-c 待导入的集合
--type csv/json(默认)
--file 备份文件路径