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")
来源:oschina
链接:https://my.oschina.net/tingqianyunluo/blog/4307894