一篇入门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:指定主机端口,可选,默认为 27017database:连接到指定的数据库服务器,若不指定,默认连接 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天入门MongoDB——2.MongoDB环境变量配置和Shell操作
上一篇:每篇半小时1天入门MongoDB——1.MongoDB介绍和安装 配置环境变量 Win10系统为例 右键单击“此电脑”——属性——高级系统设置——高级——环境变量,添加C:\Program F ...
- MongoDB【第二篇】MongoDB逻辑与物理存储结构
基本的操作 一.常用的命令和基础知识 1.进入MongoDB sehll 首先我们进入到MongoDB所在目录执行 cd /work/app/mongodb/bin/ #启动 ./mongo 为了方便 ...
- 第一篇 入门必备 (Android学习笔记)
第一篇 入门必备 第1章 初识Android 第2章 搭建你的开发环境 第3章 创建第一个程序--HelloWorld 第4章 使用Android工具 ●Android之父 Android安迪·罗 ...
- 一篇入门Express
目录 1.安装 2.Hello World 3.基础路由设置 4.高级路由设置 5.静态文件 6.中间件 7.生成器 1.安装 Express 是一个 基于 Node.js 的简洁灵活的 Web 应用 ...
- Tp5安全篇入门
输入安全 设置public目录为唯一对外访问目录,不能把资源文件放入到应用目录: 使用框架提供的请求变量获取方法(Request类的param方法及input助手函数)而不是原生系统变量获取用户输入的 ...
- 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...
- 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 ...
- 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 ...
- MongoDB基础教程系列--第一篇 进入MongoDB世界
1.什么是MongoDB MongoDB是跨平台的.一个基于分布式文件存储的数据库.由C++语言编写.用它创建的数据库具备性能高.可用性强.易于扩展等特点.MongoDB将数据存储为一个文档,数据结构 ...
随机推荐
- XAML实例教程系列 - 标记扩展(Markup Extensions) 六
XAML实例教程系列 - 标记扩展(Markup Extensions) 分类: Windows 8 Silverlight2012-06-21 13:00 1139人阅读 评论(0) 收藏 举报 扩 ...
- [翻译]NUnit---String && Collection && File && Directory Assert (七)
StringAssert (NUnit 2.2.3) StringAssert类提供一系列检查字符串的方法. CollectionAssert (NUnit 2.4 / 2.5) Collection ...
- bzoj 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富【记忆化搜索+剪枝】
c[x][y]为从(x,y)到(n,m)的最大值,记忆化一下 有个剪枝是因为y只能+1所以当n-x>m-y时就算x也一直+1也是走不到(n,m)的,直接返回0即可 #include<ios ...
- 为什么Markdown能夺得程序员的青睐
Markdown基本情况概述 Markdown是在HTML的基础上产生的.HTML的功能已经足够强大,可以编写出漂亮的网页.HTML在没有CSS的加持上,尽管不能显示出绚丽多彩的网页,但是仍然可以达到 ...
- redis在linux安装和开机启动和结合php运用方法一
第一部分:安装redis 希望将redis安装到此目录 1 /usr/local/redis 希望将安装包下载到此目录 1 /usr/local/src 那么安装过程指令如下: 1 2 3 4 5 6 ...
- 最大加权矩形 luogu1719
题目链接:https://www.luogu.org/problemnew/show/P1719 这道题挺好做的 又是一道练前缀和的题 #include <bits/stdc++.h> # ...
- 洛谷P3383 【模板】线性筛素数 (埃拉托斯特尼筛法)
题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行 ...
- php 文件上传限制修改
修改PHP上传文件大小限制的方法 1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止 ...
- 实现grep命令
#include <stdio.h> #include <string.h> #include <stdlib.h> // grep命令:grep match_pa ...
- [APIO2007]动物园
题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物. 你是动物园的公共主管.你要做的是,让每个来动物园的人都尽可能高兴.今天有一群小朋 ...