MongoDB的基础语法和使用
本篇内容简介:
一、MongoDB和MySQL 的名词映射
二、MongoDB的基本概念和系统库基本操作
1. 基本概念+简介+系统库
2. MongoDB数据库中几项 dbname.system.* 命令的基本含义
3. MongoDB数据几种常用类型
三、基本使用
1. MongoDB的Shell命令行模式
2. MongoDB跨集合多文档事务操作
3. MongoDB常用的CURD
4.MongoDB集合可选项
5.MongoDB与RDBMS WHERE语句比较
6. 部分操作符说明
7. MongoDB $type 操作符
六、注意项
一、MongoDB和Mysql 的名词映射
RDBMS(关键字/解释) | MongoDB(关键字/解释) |
---|---|
数据库(database) | 数据库(database) |
表格(table) | 集合(collection) |
行(row) | 文档(document) |
列(column) | 字段(field) |
表联合(table joins) | 嵌入文档() |
索引(index) | 索引(index) |
主键 | 主键(MongoDB提供了key为 _id) |
Mysqld(服务端入口文件) | mongod(服务端入口文件) |
二、MongoDB的基本概念和系统库基本操作
1.基本概念+简介+系统库
1. 名词:
replica set (副本集)
shard cluster (分片)
Json 和 Bson
2.MongoDB简介和注意事项:
1) 数据库
1.0) 注意事项:
A) MongoDB默认数据库为 "db",数据库存储在/data/mongodb/db (这个在启动mongodb时配置指定,可自选)
B) MongoDB单个实例可容纳多个独立数据库,每个数据库都有自己的集合和权限
C) 相关命令
show dbs; # 查看所有的数据非空的数据库列表,也可使用: show databases;若数据库test中数据为空,则列表中不显示test
use local; # 切换到数据库local
db; # 查看当前所在的数据库名
1.1)数据库命名: 不能为空字符; 数据库名种不得含有 空格,.(点),$,\(正斜杠),/(反斜杠),空字符; 且必须全部为小写; 库名长度最多64字节
1.2) mongodb的系统保留数据库名(已存在,可直接访问):
A) admin : 存储"root"权限的用户数据库;添加到这个库的用户自动继承所有数据库的权限;一些特定的服务器端命令只能从这个数据库运行(如:列出所有的数据库/关闭服务器等命令)
B) local : 这个数据永远不会被复制,用来存储只在本地单台服务器的任意集合
C) config : 当 Mongo 用于分片设置时, config 数据库在内部使用,用于保存分片的相关信息
2) 集合(对应 RDB的表table)
2.0) 集合: 是MongoDB的文档组,类似RDBMS(关系型数据库管理系统)的数据表,集合没有固定结构,即集合可以存入不同格式和类型的数据,但一般存入的数据都有一定的关联性
2.1) 合法的集合名命名规则
A) 集合名不能为空字符
B) 集合名不能含有 \0(空字符),这个字符表示集合名的结尾
C) 集合名不能以"system."开头,这是为系统集合保留的前缀
D) 集合名字不能含有系统保留字符; 特例: 有些驱动程序的确支持在集合名中包含保留字符,因为某些系统生成的集合中包含该字符; 千万不要在集合名中使用$ (除非要访问系统创建的集合)
3) 文档(对应 RDB的行记录row)
3.0) 文档: 是一组键值对(key-value); MongoDB特点(也是和RDB的区别): MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型 ????理解???
3.1) 文档的键值对是有序的
3.2) 文档中的值不仅可以是在双引号中的字符串,还可以是其他的几种数据类型(甚至可以是整个嵌入的文档)
3.3) MongoDB区分类型和大小写
3.4) MongoDB的文档不能有重复的键
3.5) 文档的键是字符串,键可使用任意UTF-8字符(除少数例外情况外)
3.6) 文档键的命名规则:
A) 键不能含有 \0(空字符),这个字符表示键的结尾
B) . 和 $ 有特别的意义,只能在特定环境下使用,如: 点用于连接数据库和表 db.table, $all , $and 表示逻辑与, $or 表示逻辑或
C) 以下划线(_)开头的键是保留的(不是严格要求,但强烈建议遵循),如: 主键 _id
4) capped collections
4.0) capped collections 是固定大小的集合
4.1) 特点: 高性能,队列过期特性(按照插入时间的顺序过期),类似RRD(时序数据库)概念
4.2) 原理:
A) 显示创建capped collection,并指定collection大小,单位是字节,collection数据存储空间是提前分配好的;
B) 文档按照插入顺序存储在collection对应的位置,当更新文档时,为了保证所有文档在磁盘的位置一直不变(从而保证高性能),故每个文档更新后的文档空间大小不能超过更新前的文档大小
C) capped collection可提高增添数据的效率(因其文档插入顺序确定下一个文档的插入位置,而不是使用索引);例如: MongoDB的操作日志文件 oplog.rs 通过 Capped Collection实现
4.3) 适合场景:记录日志; 例如: MongoDB的操作日志文件 oplog.rs 通过 Capped Collection实现
4.4) capped collection相关操作:
A) 在capped collection 中,可添加新的对象
B) 能进行更新,但对象不会存储空间,若增加空间,则更新会失败; 故更新后的内容空间不能超过更新前的内容空间,否则更新失败;
C) capped collection 不能删除一个稳定,只能使用drop()删除collection所有的行
D) 删除后,必须重新显示创建这个collection
F) 32bit机器中,capped collection 最大存储为1e9(即10^9)个字节
5) 元数据
5.0) 数据库的信息存储在集合中,如: dbname.system.*,详情见下列表格
5.1) 对于上述系统集合中对象的限制:
A) 在{
{system.indexs}}插入数据,可创建索引;但除索引外,该表信息不可变(drop index命令将自动更新相关信息)??? 更新表信息,还是数据信息?????????????
B) {
{system.users}}是可修改的
C) {
{system.profile}}是可删除的
6) MongoDB的数据类型
6.0) 见下列表格
6.1) 说明几种重要的数据类型
A) ObjectID: 类似唯一主键,可很快的生成和排序,包含12bytes
a) 前4个字节表示创建unix时间戳;(格林尼治时间UTC时间,北京时间是UTC+8,即北京时间比UTC晚8个小时)
b) 接下来三个字节是机器标识码
c) 紧接着两个字节由进程id组成PID
d) 最后三个字节是随机数
B) 字符串
a) BSON字符串都是UTF-8编码
C) 时间戳
a) BSON 有一个特殊的时间戳类型用于MongoDB内部使用,与普通日期类型不相关,时间戳值是一个64位的值:
a.1) 前32位是一个time_t值(与Unix新纪元相差的秒数)
a.2) 后32位是在某秒中操作的一个递增的序数
b) 单个mongod实例中,时间戳值通常是唯一的; 在复制集中,oplog有一个ts字段,该字段值使用BSON时间戳表示操作时间
c) BSON时间戳类型主要用于MongoDB内部使用,大部分情况,可使用BSON日期类型
D) 日期
A) 表示当前距离Unix新纪元(1970年1月1日)的毫秒数;日期类型时有符号的,负数表示1970前的日期
B) 创建时间相关命令
a)类型为object的时间
> var mydate1 = new Date() //格林尼治时间
> var mydate2 = ISODate() //格林尼治时间
> mydate1
输出: ISODate("2018-03-04T14:58:51.233Z")
> typeof mydate1 // mydate1,mydate2输出的都是object类型的时间
输出: object
b)类型为string的时间
> var mydateStr = ISODate().toString()
> var mydateStr2 = new Date().toString()
> Date()
输出: Fri Jan 10 2020 20:27:03 GMT+0800 (CST)
> typeof mydateStr // mydateStr,mydateStr2,Date()输出的都是string类型的时间
输出: string
**注意: (考虑到mysql的普及,强调一下和关系型数据管理系统RDBMS的对应关系), 格式: mongodb概念(对应mysql概念), db => collection => document
MongoDB数据库db(My