MongoDB学习(二)概念解析、命令行基本操作
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.str5a1919e63df83ce79df8b38f
2、数据库
一个mongodb 中可以建立多个数据库。(一个数据库可以创建多个集合,一个集合可以包括多个文档。)
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
- 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
数据库名 特殊作用
admin
权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local
这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
config
当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
2.1、数据库操作:命令行
- "show dbs" 命令可以显示所有数据的列表。
执行 "db" 命令可以显示当前数据库对象或集合。
- 如果当前没有切换数据库,默认显示"test"
运行 "use" 命令,可以连接到一个指定的数据库。
- 数据库存在则切换到此数据库,不存在则创建
- 新创建的数据库不显示,需要至少包含一个集合
user 数据库名称
删除数据库(慎用!!!)
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}
当第一个文档插入时,集合就会被创建。
合法的集合名
- 集合名不能是空字符串""。
- 集合名不能含有字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"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、文档键命名规范:
- 键不能含有 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
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")
以上是 MongoDB学习(二)概念解析、命令行基本操作 的全部内容, 来源链接: utcz.com/z/534093.html