一篇入门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将数据存储为一个文档,数据结构 ...
随机推荐
- wtpwebapps下没有相应的文件
右击clean
- ZOJ2107 Quoit Design 最近点对
ZOJ2107 给定10^5个点,求距离最近的点对的距离. O(n^2)的算法是显而易见的. 可以通过分治优化到O(nlogn) 代码很简单 #include<iostream> #inc ...
- bzoj1999 (洛谷1099) 树网的核——dfs
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999 https://www.luogu.org/problemnew/show/P109 ...
- Python基础第二天
一.内容 二.练习 练习1 题目:已知msg='hello knight 666'编写for循环,利用索引遍历出每一个字符 图示: 代码: msg = 'hello knight 666' msg_l ...
- openstack dnsmasq调试
- 正则表达式:(?=a)是什么意思?
1.(?=a) 表示我们需要匹配某样东西的前面. 2.(?!a) 表示我们需要不匹配某样东西. 3.(?:a) 表示我们需要匹配某样东西本身. 4.(?<=a) 表示我们需要匹配某样东西的后面. ...
- 【计蒜客习题】 取石子游戏(gcd)
问题描述 蒜头君和花椰妹在玩一个游戏,他们在地上将 n 颗石子排成一排,编号为 1 到 n.开始时,蒜头君随机取出了 2 颗石子扔掉,假设蒜头君取出的 2 颗石子的编号为 a, b.游戏规则如下,蒜头 ...
- Juicer.js模板引擎问题
由于jsp中的EL表达式语法和jquery.tmpl十分类似,,所以单纯的使用${name},数据是渲染不上tmpl的. SO.. 要加上转义: ${'${'}amount} 或者 \${amount ...
- Enumerable.Union<TSource> 方法
功能:生成两个序列的并集(使用默认的相等比较器). 命名空间: System.Linq 程序集: System.Core.dll 备注:实现此方法时使用了延迟执行. 它直接返回一个对象,该对象存储了执 ...
- 387 First Unique Character in a String 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1.案例:s = "leetcode"返回 0.s = "loveleetcode&qu ...