一篇入门MongoDB

1、MongoDB 基本介绍

(1)安装 MongoDB

简单来说,MongoDB 是一个由 C++ 语言编写的基于分布式文件存储的开源数据库系统

由于安装 MongoDB 的教程很容易在网上找到,所以这里就不再多讲吧

执行 bin 目录下的 mongod.exe 文件,可以打开一个交互式窗口,我们可以在其中进行简单的交互操作

mongo

(2)启动 MongoDB 服务

启动 MongoDB 服务的基本语法格式如下:

mongodb://[username:password@]host[:port][/[database][?options]]
  • mongodb://:固定格式
  • username:password@:可选项,使用指定的用户名和密码连接到数据库服务器
  • host:指定主机地址,最少必须指定一个,也可以指定多个
  • port:指定主机端口,可选,默认为 27017
  • database:连接到指定的数据库服务器,若不指定,默认连接 test 数据库
  • ?options:连接选项

例如:

使用默认端口连接到本地的 MongoDB 服务

mongodb://localhost

使用用户名和密码连接到本地的 MongoDB 服务

mongodb://admin:123456@localhost/

使用用户名和密码连接到本地的 MongoDB 服务的指定数据库

mongodb://admin:123456@localhost/myDB

(3)可视化工具

另外,最近还在网上看到了一个挺好的可视化工具,这里也给大家推荐一下:adminMongo

安装 adminMongo 的方法也很简单(在此之前必须先安装好 Git 和 Node.js):

  • 克隆仓库到本地
git clone https://github.com/mrvautin/adminMongo
  • 进入仓库
cd adminMongo
  • 安装 adminMongo
npm install
  • 启动 adminMongo
npm start

2、MongoDB 基本概念

由于 MongoDB 和我们常用的关系型数据库也有一定的联系,这里先给大家说一下,便于类比学习

关系型数据库 MongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 主键 (MongoDB 提供 _id )

(1)数据库

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

MongoDB 的单个实例可以容纳多个独立的数据库,不同的数据库放置在不同的文件中

以下是几个特殊的数据库:

  • admin:从权限上看类似于 root,若将一个用户添加到该数据库,则该用户继承所有数据库的权限
  • config:当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片的相关信息
  • local:其中的数据永远不能被复制,可以用来存储限于本地单台服务器的任意集合
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

(2)集合

集合是 MongoDB 文档的集合,类似于关系型数据库中表格的概念

集合没有固定的结构,可以在集合中插入不同格式和类型的数据,但是通常情况下这些数据都有一定的关联性

MongoDB 对集合名有一定的要求:

  • 集合名不能是空字符串
  • 集合名不能含有空字符 \0,空字符表示集合名的结尾
  • 集合名不能以 system. 开头,system. 是为系统集合保留的前缀
  • 集合名不能含有保留字符

(3)文档

文档是一组键值对,类似于关系型数据库中行的概念,其数据结构与 JSON 基本一样

文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,但是文档中的键值对必须是有序的

MongoDB 对文档键名也有一定的要求:

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

(4)元数据

数据库的信息是存储在集合中的,它们使用系统的命名空间 <dbname>.system.*

<dbname>.system.* 其实是包含多种系统信息的特殊集合,具体有:

集合命名空间 描述
dbname.system.users 所有可访问数据库的用户
dbname.system.namespaces 所有命名空间
dbname.system.indexes 所有索引
dbname.system.profile 包含数据库概要信息
dbname.local.sources 包含复制对端的服务器信息和状态

(5)基本数据类型

数据类型 描述
Null 空值
Boolean 布尔值
Binary Data 二进制数据
Integer 整型数值,可分为 32 位或 64 位
Double 双精度浮点值
String 字符串,规定编码为 UTF-8
Symbol 符号,基本上等同于字符串,用于具有特殊符号类型的语言
Date 日期时间,使用 UNIX 时间格式存储日期或时间
Timestamp 时间戳,用于记录文档操作的具体时间
Array 用于将数组或列表或多个值存储为一个键
Object 用于内嵌文档
Object ID 对象 ID,用于创建文档 ID
Code 代码类型,用于存储 JavaScript 代码
Regular expression 正则表达式类型,用于存储正则表达式
Min/Max keys 将一个值与 BSON 元素的最低值和最高值相对比

3、数据库操作

MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将默认存放在 test 数据库中

(1)创建数据库

use DATABASE_NAME

如果数据库存在,则切换到指定的数据库;如果数据库不存在,则创建数据库

例如,以下演示创建 myDB 数据库:

> use myDB
switched to db myDB

(2)查看已有数据库

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

注意:刚刚创建的数据库并不会出现在数据库列表中,只有向新创建的数据库中插入数据后,才会显示

(3)查看当前数据库

> db
myDB

(4)删除数据库

> db.dropDatabase()
{ "ok" : 1 }

该语句指定删除 当前数据库,建议删除之前先使用 db 命名确定当前数据库

4、集合操作

(1)创建集合

db.createCollection(name, options)
  • name:集合的名称
  • options:可选参数
    • capped:若为 true,则创建固定集合,且此时必须要指定 size 参数
    • autoIndexId:若为 true,则自动在 _id 字段创建索引,默认为 false
    • size:为固定集合指定一个最大值(以字节计)
    • max:指定固定集合中包含文档的最大数量

例如,以下演示在 myDB 数据库中创建集合 myCol

> use myDB
switched to db test
> db.createCollection("myCol")
{ "ok" : 1 }

注意:在 MongoDB 中,创建集合之后要再插入文档,集合才会真正创建

另外,一般不需要创建集合,因为当我们插入文档时,MongoDB 会自动创建集合

(2)查看已有集合

> show collections
myCol

(3)删除集合

db.COLLECTION_NAME.drop()

例如,以下演示删除 myDB 数据库中的 myCol 集合:

> db.myCol.drop()
true

5、文档操作

(1)插入文档

db.COLLECTION_NAME.insert(document)

注意:如果集合不在数据库中, MongoDB 会自动创建该集合并插入文档

例如,以下演示在 myDb 数据库中的 myCol 集合插入文档:

> use myDB
switched to db myDB
> db.myCol.insert({"name":"Steve"})
WriteResult({"nInserted":1})

另外,在新版本的 MongoDB 中还添加了下面两种语法:

  • db.COLLECTION_NAME.insertOne():向指定集合中插入一条文档数据

  • db.COLLECTION_NAME.insertMany():向指定集合中插入多条文档数据

(2)更新文档

① 更新已存在的文档

db.COLLECTION_NAME.update(
    <query>,
    <update>,
    {
        upsert: <boolean>,
        multi: <boolean>,
        writeConcern: <document>
    }
)
  • query:查询条件,查询被更新对象
  • update:更新对象
  • upsert:可选,当不存在 update 时,若为 true,插入 objNew,默认为 false,不插入
  • multi:可选,若为 true,则更新所有符合条件的记录,默认为 false,只更新找到的第一条记录
  • writeConcern:可选,指定抛出异常的级别

例如,以下演示更新 myDB 数据库中的 myCol 集合中的数据字段 name:

> db.myCol.update({"name":"Steve"},{$set:{"name":"MongoDB"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

② 通过传入的文档替换已存在的文档

db.COLLECTION_NAME.save(
    <document>,
    {
        writeConcern: <document>
    }
)
  • document:文档数据
  • writeConcern:可选,指定抛出异常的级别

(3)查询文档

db.COLLECTION_NAME.find(query, projection)
  • query :可选,指定查询文档的条件
  • projection :可选,使用投影操作符指定返回的键,默认为省略,表示返回文档中所有的键

例如,以下演示查询 name 字段等于 MongoDB 的文档:

> db.myCol.find({"name":"MongoDB"}).pretty()
{ "_id" : ObjectId("5c7c069826cb01475e68f64e"), "name" : "MongoDB" }

(4)删除文档

db.COLLECTION_NAME.remove(
    <query>,
    {
        justOne: <boolean>,
        writeConcern: <document>
    }
)
  • query:可选,指定删除文档的条件
  • justOne:可选,若为 true,则只删除一个文档,默认为 false,删除所有匹配的文档
  • writeConcern:可选,定义抛出异常的级别

例如,以下演示删除 myDB 数据库中的 myCol 集合中的 name 字段等于 MongoDB 的文档:

> db.myCol.remove({"name":"MongoDB"})
WriteResult({ "nRemoved" : 1 })

另外,在新版本的 MongoDB 中还添加了下面两种语法:

  • db.COLLECTION_NAME.deleteMany():删除集合中所有符合条件的文档

  • db.COLLECTION_NAME.deleteOne():删除集合中符合条件的第一个文档

6、查询条件

(1)条件操作符

描述 操作符 格式
等于 \ {<key>:<value>}
不等于 $ne {<key>:{$ne:<value>}}
小于 $lt {<key>:{$lt:<value>}}
小于等于 $lte {<key>:{$lte:<value>}}
大于 $gt {<key>:{$gt:<value>}}
大于等于 $gte {<key>:{$gte:<value>}}
AND 条件 \ {<key1>:<value1>,<key2>:<value2>}
OR 条件 $or {$or:[{<key1>:<value1>},{<key2>:<value2>}]}
Type 条件 $type {<key>:{$type:<value>}}

其中,$type 条件操作符的可选值如下:

类型 数字
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6
Object Id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Max key 127
Min key 255

(2)模糊查询

查询 <key> 中包含 <value> 的文档:

db.COLLECTION_NAME.find({<key>:/<value>/})

查询 <key> 中以 <value> 开头的文档:

db.COLLECTION_NAME.find({<key>:/^<value>/})

查询 <key> 中以 <value> 结尾的文档:

db.COLLECTION_NAME.find({<key>:/<value>$/})

(3)处理方法

pretty() 方法可以格式化输出:

db.COLLECTION_NAME.find().pretty()

limit() 方法指定读取一定数量的记录数,参数 NUMBER 用于指定数量

db.COLLECTION_NAME.find().limit(NUMBER)

skip() 方法指定跳过一定数量的记录数,参数 NUMBER 用于指定数量

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

sort() 方法用于对数据进行排序,参数 KEY 指定根据哪个键值进行排序

参数 VALUE 指定根据什么方式进行排序,若为 1,则指定升序排列,若为 -1,则指定降序排列

db.COLLECTION_NAME.find().sort({KEY:VALUE})

7、索引

索引是特殊的数据结构,它对集合中的一列或多列进行排序,建立索引有利于提高查询效率

如果没有索引,MongoDB 将扫描指定集合中的所有文档以确定它们是否符合查询条件

(1)创建索引

db.COLLECTION_NAME.createIndex(keys, options)
  • keys:指定要创建索引的字段,至少指定一个,也可以指定多个

    其值若为 1,则按升序创建索引,若为 -1,则按降序创建索引

  • options:可选参数

    • background:指定以后台的方式创建索引
    • unique:若为 true,则建立的索引唯一,默认为 false,建立的索引不唯一
    • name:索引的名称,默认根据连接索引的字段名和排序顺序生成
    • sparse:若为 true,则不对文档中不存在的字段数据启用索引,默认为 false
    • expireAfterSeconds:指定集合的生存时间,以秒为单位
    • v:索引的版本号,默认为 MongoDB 创建索引时运行的版本
    • weights:索引的权重值,表示该索引相对于其他索引的得分权重,数值在 1 到 99999 之间
    • default_language:对于文本索引,决定停用词及词干和词器的规则的列表,默认为英语
    • language_override:对于文本索引,指定包含在文档中的字段名,默认值为 language

例如,以下演示在后台根据键 name 的升序排序创建索引:

> use myDB
switched to db myDB
> db.myCol.insertMany([{"name":"Mongo"},{"name":"Oracle"},{"name":"MySQL"}])
{
    "acknowledged": true,
    "insertedIDs" : [
        ObjectID("5c7cf09bea18305e120a9ee5"),
        ObjectID("5c7cf09bea18305e120a9ee6"),
        ObjectID("5c7cf09bea18305e120a9ee7")
    ]
}
> db.myCol.createIndex({"name": 1}, {background: true})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

(2)查看索引大小

db.COLLECTION_NAME.totalIndexSize()

例如,以下演示查看刚刚创建的索引的大小:

> db.myCol.totalIndexSize()
32768

(3)删除索引

① 删除集合的所有索引

db.COLLECTION_NAME.dropIndexes()

② 删除集合的指定索引

db.COLLECTION_NAME.dropIndex(INDEX_NAME)

例如,以下演示删除刚刚创建的索引:

> db.myCol.dropIndexes()
{
    "nIndexesWas" : 2,
    "msg" : "non-_id indexes dropped for collection",
    "ok" : 1
}

猜你喜欢

转载自www.cnblogs.com/wsmrzx/p/10474157.html