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
}

一篇入门MongoDB的更多相关文章

  1. 每篇半小时1天入门MongoDB——2.MongoDB环境变量配置和Shell操作

    上一篇:每篇半小时1天入门MongoDB——1.MongoDB介绍和安装 配置环境变量 Win10系统为例 右键单击“此电脑”——属性——高级系统设置——高级——环境变量,添加C:\Program F ...

  2. MongoDB【第二篇】MongoDB逻辑与物理存储结构

    基本的操作 一.常用的命令和基础知识 1.进入MongoDB sehll 首先我们进入到MongoDB所在目录执行 cd /work/app/mongodb/bin/ #启动 ./mongo 为了方便 ...

  3. 第一篇 入门必备 (Android学习笔记)

    第一篇 入门必备 第1章 初识Android 第2章 搭建你的开发环境 第3章 创建第一个程序--HelloWorld 第4章 使用Android工具   ●Android之父 Android安迪·罗 ...

  4. 一篇入门Express

    目录 1.安装 2.Hello World 3.基础路由设置 4.高级路由设置 5.静态文件 6.中间件 7.生成器 1.安装 Express 是一个 基于 Node.js 的简洁灵活的 Web 应用 ...

  5. Tp5安全篇入门

    输入安全 设置public目录为唯一对外访问目录,不能把资源文件放入到应用目录: 使用框架提供的请求变量获取方法(Request类的param方法及input助手函数)而不是原生系统变量获取用户输入的 ...

  6. 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...

  7. 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 ...

  8. 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 ...

  9. MongoDB基础教程系列--第一篇 进入MongoDB世界

    1.什么是MongoDB MongoDB是跨平台的.一个基于分布式文件存储的数据库.由C++语言编写.用它创建的数据库具备性能高.可用性强.易于扩展等特点.MongoDB将数据存储为一个文档,数据结构 ...

随机推荐

  1. wtpwebapps下没有相应的文件

    右击clean

  2. ZOJ2107 Quoit Design 最近点对

    ZOJ2107 给定10^5个点,求距离最近的点对的距离. O(n^2)的算法是显而易见的. 可以通过分治优化到O(nlogn) 代码很简单 #include<iostream> #inc ...

  3. bzoj1999 (洛谷1099) 树网的核——dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999  https://www.luogu.org/problemnew/show/P109 ...

  4. Python基础第二天

    一.内容 二.练习 练习1 题目:已知msg='hello knight 666'编写for循环,利用索引遍历出每一个字符 图示: 代码: msg = 'hello knight 666' msg_l ...

  5. openstack dnsmasq调试

  6. 正则表达式:(?=a)是什么意思?

    1.(?=a) 表示我们需要匹配某样东西的前面. 2.(?!a) 表示我们需要不匹配某样东西. 3.(?:a) 表示我们需要匹配某样东西本身. 4.(?<=a) 表示我们需要匹配某样东西的后面. ...

  7. 【计蒜客习题】 取石子游戏(gcd)

    问题描述 蒜头君和花椰妹在玩一个游戏,他们在地上将 n 颗石子排成一排,编号为 1 到 n.开始时,蒜头君随机取出了 2 颗石子扔掉,假设蒜头君取出的 2 颗石子的编号为 a, b.游戏规则如下,蒜头 ...

  8. Juicer.js模板引擎问题

    由于jsp中的EL表达式语法和jquery.tmpl十分类似,,所以单纯的使用${name},数据是渲染不上tmpl的. SO.. 要加上转义: ${'${'}amount} 或者 \${amount ...

  9. Enumerable.Union<TSource> 方法

    功能:生成两个序列的并集(使用默认的相等比较器). 命名空间: System.Linq 程序集: System.Core.dll 备注:实现此方法时使用了延迟执行. 它直接返回一个对象,该对象存储了执 ...

  10. 387 First Unique Character in a String 字符串中的第一个唯一字符

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1.案例:s = "leetcode"返回 0.s = "loveleetcode&qu ...