前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB学习整理

MongoDB学习整理

作者头像
csxiaoyao
发布2019-04-09 15:09:09
5660
发布2019-04-09 15:09:09
举报
文章被收录于专栏:csxiaoyaocsxiaoyao

版权声明:本文为CS逍遥剑仙原创文章,未经允许不得转载

MongoDB学习整理

文章目录

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

1. 概述

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

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

代码语言:javascript
复制
{"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()

代码语言:javascript
复制
> 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
代码语言:javascript
复制
# 删除 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({<条件>},{<修改器名称>:{<修改键>:<修改新值>}})

代码语言:javascript
复制
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({<条件>})

代码语言:javascript
复制
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则创建的用户只能查询,不能修改。

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

代码语言:javascript
复制
> use admin
> db.addUser('root','123456')
> use test
> db.addUser('sunshine','123456',true)

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

验证权限(用户登录)

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

删除用户和修改密码

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

总结说明

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

5. 索引

代码语言:javascript
复制
> 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降序

代码语言:javascript
复制
# 为name创建索引
db.test.ensureIndex({name:1})

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

5.2 多列索引(复合索引)

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

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

5.3 子文档索引

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

代码语言:javascript
复制
# 文档
{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 查询索引

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

5.6 删除索引

代码语言:javascript
复制
# 删除单个索引
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. 数据导出与导入

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

// 导入数据
mongoimport
-d 待导入数据库
-c 待导入的集合
--type csv/json(默认) 
--file 备份文件路径
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB学习整理
    • 文章目录
      • 1. 概述
        • 2. 入门语句
          • 3. 增删改查操作
            • 4. 用户管理(权限控制)
              • 5. 索引
                • 5.1 普通单列索引
                • 5.2 多列索引(复合索引)
                • 5.3 子文档索引
                • 5.4 唯一索引
                • 5.5 查询索引
                • 5.6 删除索引
                • 5.7 重建索引
                • 5.8 注意事项
              • 6. 数据导出与导入
              相关产品与服务
              云数据库 MongoDB
              腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档