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

database

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" 命令,可以连接到一个指定的数据库。

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

    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

回到顶部