MongoDB学习(二) --- 概念解析、命令行基本操作

两盒软妹~` 提交于 2020-08-13 16:10:51

1、基础概念

下表将帮助您更容易理解Mongo中的一些概念:

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

1.1、MongoDB 数据类型

数据类型 描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。
Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。

下面说明一下几种重要的数据类型。

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

  • 前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
  • 接下来的 3 个字节是机器标识码
  • 紧接的两个字节由进程 id 组成 PID
  • 最后三个字节是随机数

MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象

由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:

> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")

ObjectId 转为字符串

> newObject.str
5a1919e63df83ce79df8b38f

2、数据库

一个mongodb 中可以建立多个数据库。(一个数据库可以创建多个集合,一个集合可以包括多个文档。)

MongoDB的默认数据库为"db",该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

  • 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
数据库名 特殊作用
admin 权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
config 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

2.1、数据库操作:命令行

  • "show dbs" 命令可以显示所有数据的列表。

  • 执行 "db" 命令可以显示当前数据库对象或集合。

    • 如果当前没有切换数据库,默认显示"test"

  • 运行 "use" 命令,可以连接到一个指定的数据库。

    • 数据库存在则切换到此数据库,不存在则创建
    • 新创建的数据库不显示,需要至少包含一个集合
    use 数据库名称
    

  • 删除数据库(慎用!!!)

    db.dropDatabase()
    

3、集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。一个数据库可以创建多个集合,一个集合是讲相同类型的文档管理起来。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

比如,我们可以将以下不同数据结构的文档插入到集合中:

{"site":"https://my.oschina.net/tingqianyunluo"}
{"site":"https://www.zhihu.com/people/tingqianyunluo/posts","name":"庭前云落的知乎"}
{"site":"https://www.jianshu.com/u/a260a4c93d26","name":"简书","num":6}

当第一个文档插入时,集合就会被创建。

合法的集合名

  • 集合名不能是空字符串""。
  • 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
  • 集合名不能以"system."开头,这是为系统集合保留的前缀。
  • 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。 

3.1、集合操作:命令行

  • 创建集合

    db.createCollection(name, options)
    	name: 新创建的集合名称
    	options: 创建参数
    
    -- 实例
    use demo
    db.createCollection("student")
    show dbs
    

  • 删除集合

    db.集合名词.drop()
    -- 实例
    use demo
    show collections
    db.student.drop()
    

4、文档(Document)

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

文档示例:

{"site":"https://my.oschina.net/tingqianyunluo", "name":"庭前云落"}

下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMS MongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 主键 (MongoDB 提供了 key 为 _id )
数据库服务和客户端
Mysqld/Oracle mongod
mysql/sqlplus mongo

4.1、需要注意的是:

  • 1、文档中的键/值对是有序的。
  • 2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  • 3、MongoDB区分类型和大小写。
  • 4、MongoDB的文档不能有重复的键。
  • 5、文档的键是字符串。除了少数例外的情况,键可以使用任意UTF-8字符。

4.2、文档键命名规范:

  • 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
  • .和$有特别的意义,只有在特定环境下才能使用。
  • 以下划线"_"开头的键是保留的(不是严格要求的)。

4.3、文档操作:命令行

4.3.1、插入命令

  • 每个文档默认以_id为主键,主键默认类型为ObjectId(对象类型)

  • mongodb会自动生成主键值

    db.集合名称.insert(document)
    -- 实例
    db.student.insert({"name":"tqyl","age":10})
    

4.3.2、查询命令

  • 查询全部

    db.集合名称.find()
    -- 实例
    db.student.find()
    

  • 查询符合条件的记录

    db.集合名称.find(JSON条件)
    -- 实例
    db.student.find({"name":"tqyl"})
    

  • 投影查询

    • 只显示name和age两个key,_id主键不显示
    db.集合名称.find(JSON条件,{显示字段名:1 ,不显示字段名:0 , ...})
    -- 实例
    db.student.find({"name":"tqyl"},{name:1,age:1,_id:0})
    

4.3.3、更新文档

  • 命令格式
db.collection.update(
	<query>,
	<update>,
	<options>
)
query:查询条件,相当于sql语句的where
update:更新文档内容
options:选项
  • 替换文档

    db.student.update({"name":"tqyl"},{"name":"庭前云落","age":21})
    

  • $set修改器

    • 使用$set修改器指定要更新的key,key不存在则创建,存在则更新
    db.student.update({"name":"庭前云落"},{$set: {"name":"庭前云落666"} })
    

  • multi 替换所有

    • multi:false 表示更新第一个匹配的文档,true表示更新所有匹配的文档
    db.student.update({"name":"庭前云落666"},{$set:{ "age":15}},{multi:true})
    

4.3.4、删除文档

  • 删除符合条件的文档

    db.集合名称.remove(<query>)
    query:删除条件,相当于sql语句中的where
    
    db.student.remove({"name":"庭前云落666"})
    

  • 通过id删除

    db.student.remove({"_id" : ObjectId("5ee1de68e8f3d5213a6e6cb8")})
    
  • 删除所有文档

    db.student.remove({})
    

5、用户操作:命令行

5.1、创建用户

  • 语法格式:
db.createUser({ 
	user: "<name>",
	pwd: "<cleartext password>",
	customData: { <any information> },
	roles: [
		{ role: "<role>", db: "<database>" } | "<role>",
		...
	]
})

-- 创建root用户,角色为root
use admin
db.createUser({
	user:"root",
	pwd:"root",
	roles:[{role:"root",db:"admin"}]
})
  • 内置角色
角色分类 取值
超级用户角色 root
数据库用户角色 read、readWrite
数据库管理角色 dbAdmin、dbOwner、userAdmin
集群管理角色 clusterAdmin、clusterManager、hostManager、clusterMonitor
备份恢复角色 backup、restore
所有数据库角色 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
角色名 描述
root 只在admin数据库中可用。超级账号,超级权限
Read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户<br/>clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限

5.1、查询用户

  • 查询当前库下的所有用户
show users

5.2、修改用户

  • 语法格式
db.updateUser(
"<username>",
{
	customData : { <any information> },
	roles : [
		{ role: "<role>", db: "<database>" } | "<role>",
		...
	],
	pwd: "<cleartext password>"
},
writeConcern: { <write concern> }
)

-- 修改root用户的角色为readWriteAnyDatabase
use admin
db.updateUser("root",{roles:[{role:"readWriteAnyDatabase",db:"admin"}]})

5.3、修改密码

  • 语法格式

    db.changeUserPassword("username","newPasswd")
    
    -- 修改root用户的密码为1234
    use admin
    db.changeUserPassword("root","1234")
    

5.4、删除用户

  • 语法格式:
db.dropUser("用户名")

-- 实例
db.dropUser("root")
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!