一篇入门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
}
最新文章
- C#异常处理性能测试
- 《java中异常和错误》
- Entity Framework与ADO.Net及NHibernate的比较
- MongoDB增删查改
- 十三、Java基础---------多线程总结
- CC3000 主机驱动API介绍
- Ogre2.1 灯光与阴影
- MongoDB相关资料收集
- Python学习教程(learning Python)--1.2.4 Python格式化输出科学计数
- redis高级实用特性
- bzoj3561DZY Loves Math VI
- 使用ES6的模块编写web页面碰到的坑
- 尝试 Markdown 写测试用例
- MAC洪水攻击
- hdp3: regionserver running as process 3170. Stop it first.
- HttpWebRequest - Asynchronous Programming Model/Task.Factory.FromAsyc
- ABP中针对sql2008的数据库配置
- delphi控制 word的几种方法--转
- 设置 Linux 下打印机的几种方式
- EditPlus 4.3.2502 中文版已经发布(12月5日更新)