一、MongoDB介绍
MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易于扩展。由C++语言编写的(这点很重要,则表示在Linux下需要安装gcc环境),MongoDB是工作在集合和文档上一种概念,是以文档的形式存储数据,数据结构由键值(key:value)对组成,类似JSON。
MongoDB数据库基本结构模型:
MongoDB结构由大及小为库,集合,文档 ,最小单位为文档,文档用的是BSON(类似JSON) 的结构存储。
二、MongoDB安装
Windows上安装MongoDB
首先从 http://www.mongodb.org/downloads 下载 MongoDB 的最新版本
双击安装
注意: 安装的时候不要选择 Install MongoDB Copmpass 这是MongoDB的图形工具,勾选会下载安装 时间非常慢,开始我就没注意等了好久 ,然后重装了 。
安装完成后首先在安装目录的data文件夹中新建一个db目录,设置data备份路径
需要切换路径到MongoDB的bin目录,
执行命令: mongod.exe --dbpath D:\MongoDB\data
路径为你的安装路径的data文件夹
此时我们可以用浏览器访问localhost:27017 表示mongodb数据库服务已启动
然后另开一个窗口执行: 就可以运行mongo命令了
注意:每次启动需要执行指定数据库文件地址的命令 用以启动服务, 服务启动后才能使用。当然也可以做成以服务方式启动。
同时指定日志文件存在位置,在log文件夹下建立mongodb.log文件:
mongod.exe --dbpath D:\MongoDB\data --logpath D:\MongoDB\log\mongodb.log
三、MongoDB基本指令操作
操作的指令都是一样的,我这里使用的windos系统
1、创建数据库 语法:use DATABASE_NAME
检查当前选择的数据库使用命令: db
查询数据库列表使用命令: show dbs
MongoDB的默认数据库是test。 如果没有创建任何数据库,那么集合将被保存在测试数据库。
2、删除数据库 语法:db.dropDatabase()
直接使用该命令,会删除选定的数据库。如果没有选择任何数据库,那么它会删除默认的“test”数据库
3、创建集合 语法:db.createCollection(name, options)
使用 show collections 命令来检查创建的集合
db.createCollection("mycol", { capped:true, autoIndexID:true, size:6142800, max:10000 } )
4、删除集合 语法:db.COLLECTION_NAME.drop()
5、插入文档 语法:db.COLLECTION_NAME.insert(document)
如果集合 mycol 不存在于数据库中,那么MongoDB会创建此集合,然后插入文档进去。
如果我们不指定_id参数插入的文档,那么 MongoDB 将为文档分配一个唯一的ObjectId。_id 是12个字节十六进制数在一个集合的每个文档是唯一的。
若要以单个查询插入多个文档,可以通过文档 insert() 命令的数组方式
db.yourcol.insert(
[
{title:'mongodb学习',
name:'李掰掰',
age:50
},
{title:'java学习',
name:'李晓梅',
age:20
}
])
6、查找文档 语法:db.COLLECTION_NAME.find()
find() 方法将在非结构化的方式显示所有的文件。 如果显示结果是格式化的,那么可以用pretty() 方法。
除了find()方法还有findOne()方法,仅返回一个文档。
使用条件查询文档:
使用 AND 语法 db.mycol.find({key1:value1, key2:value2}).pretty()
在 find()方法,如果您传递多个键通过";"将它们分开,那么MongoDB对待它就如AND条件一样。
db.yourcol.find({"name":"李掰掰","age":50}).pretty()
使用OR 语法 需要使用OR关键字:
db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
db.yourcol.find({,$or:[{“name”:“李掰掰”},{“title”:“java”}]}).pretty()
同时使用OR 和 AND ,我们来尝试一个比较复杂的where条件" where age > 20 and (name=“李掰掰” or title = “java学习”)",示例:
db.yourcol.find({"age":{$gt:20},$or:[{"name":"李掰掰"},{"title":"java学习"}]}).pretty()
7、更新文档
MongoDB的update()和save()方法用于更新文档到一个集合。update()该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变,
save()方法同样用于插入数据到文档中,功能是类似于insert方法。与insert方法不同的是,save方法是遍历文档,逐条将数据插入进去的,而insert方法是将整个文档整体插入进去的。
语法:db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)
示例:db.mycol.update({'title':'jquery'},{$set:{'title':'C++'}})
8、save() 方法
save() 方法取代,通过新文档到 save()方法
语法:db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
示例:
db.mycol.save(
{
"_id" : ObjectId("5d2e85bd0798ba1582f23d40"), "name":"linda","age":28,"title":"English"
}
)
9、删除文档
MongoDB 的 remove()方法用于从集合中删除文档。remove()方法接受两个参数。一个是标准缺失,第二是justOne标志
(1)、deletion criteria : 根据文件(可选)删除条件将被删除。
(2)、justOne : (可选)如果设置为true或1,然后取出只有一个文档。
语法:
db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
db.COLLECTION_NAME.remove(DELETION_CRITERIA,1) --只删除一个
db.COLLECTION_NAME.remove() --删除所有
示例:
10、MongoDB投影
mongodb投影意义是只选择需要的数据,而不是选择整个一个文档的数据。如果一个文档有5个字段,只需要显示3个,只从中选择3个字段。
MongoDB的find()方法,解释了MongoDB中查询文档接收的第二个可选的参数是要检索的字段列表。在MongoDB中,当执行find()方法,那么它会显示一个文档的所有字段。要限制这一点,需要设置字段列表值为1或0。1是用来显示字段,而0被用来隐藏字段。
语法:db.COLLECTION_NAME.find({},{KEY:1})
示例:
db.mycol.find({},{"name":1,"age":1,_id:0})
备注:不要显示的字段除id外 key不填即可,因为_id字段始终显示,如果不想要显示这个字段,那么需要将其设置为0
11、MongoDB Limit() 方法
要在MongoDB中限制记录,需要使用limit()方法。 limit() 方法接受一个数字类型的参数,这是要显示的文档数量。
语法:db.COLLECTION_NAME.find().limit(NUMBER)
示例: db.coll.find({},{"name":1,_id:0}).limit(2)
12、MongoDB Skip() 方法
除了 limit()方法还有一个方法 skip()也接受数字类型参数并用于跳过文件数。
语法:db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
示例:db.coll.find({},{"name":1,_id:0}).limit(2).skip(1)
13、文档排序
要排序MongoDB中的文档,需要使用 sort()方法。 sort() 方法接受一个包含字段列表以及排序顺序的文档。 要使用1和-1指定排序顺序。1用于升序,而-1是用于降序。
语法:db.COLLECTION_NAME.find().sort({KEY:1})
示例:db.coll.find({},{"name":1,"age":1,_id:0}).sort({"age":-1})
备注:如果不指定排序类型,那么 sort() 方法将以升序排列文档。
14、MongoDB索引
索引支持查询高效率执行。如果没有索引,MongoDB必须扫描集合中的每一个文档,然后选择那些符合查询语句的文档。若需要 mongod 来处理大量数据,扫描是非常低效的。
索引是特殊的数据结构,存储在一个易于设置遍历形式的数据的一小部分。索引存储在索引中指定特定字段的值或一组字段,并排序字段的值。要创建索引,需要使用MongoDB的ensureIndex()方法。
语法:db.COLLECTION_NAME.ensureIndex({KEY:1})
KEY表示创建索引字段,1是按名称升序排序,-1即为降序。
示例:db.coll.ensureIndex({"age":1})
在 ensureIndex()方法,可以通过多个字段,来创建多个字段索引
db.coll.ensureIndex({"age":-1,"name":1})
ensureIndex() 方法还接受选项列表(这是可选),其列表如下:
15、MongoDB 聚合
聚合操作处理数据记录并返回计算结果。从多个文档聚合分组操作数值,并可以执行多种对分组数据业务返回一个结果。 在SQL中的count(*),使用group by 与mongodb的聚合是等效的。 对于MongoDB的聚合,使用的是aggregate()方法。
语法:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
在以下集合中,查询每种瓜果的的数量,那么使用aggregate()方法,如下图所示:
db.fruit.insert([
{
name: '西红柿',
type: '水果',
title: '我是水果'
},
{
name: '西红柿',
type: '蔬菜',
title: '我也是蔬菜'
},
{
name: '苹果',
type: '水果',
title: '我是水果'
},{
name: '南瓜',
type: '蔬菜',
title: '我是蔬菜'
}
])
以上类似于sql: select name,count(*) from fruit group by name;
一个列表中可用的聚集表达式如下:
16、MongoDB 复制
复制是同步在多个服务器上的数据过程。复制提供了冗余和数据在不同的数据库服务器上的多个副本提高数据的可用性,复制防止在单个服务器上丢失数据库。 复制也可以从硬件故障和服务中断中恢复。带有数据的其他副本,可以选择其中一个灾难恢复,报告或备份。
复制的作用:
- 为了让数据更安全
- 数据的高(24*7)可用性
- 灾难恢复
- 无停机维护(如备份,索引重建,压缩)
- 读取缩放(额外的副本来读取)
- 副本集是透明的应用
复制原理
MongoDB通过使用副本集的复制来实现。副本集是一组承载同一个数据集的mongod实例。在副本的一个节点是接收所有的写操作主节点。所有的实例,次级,应用操作从主以便它们具有相同的数据集。副本集只能有一个主节点。
- 副本集是一组两个或更多个节点(通常至少3节点是必需的)。
- 在副本集一个节点是主节点和其余的节点都是次要的。
- 所有的数据复制是从主到次节点。
- 在自动故障转移或维护时,选建立了主要和一个新的主节点被选择。
- 故障节点的恢复后,再次加入副本集,并可以作为一个辅助节点。
mongodb复制的典型图如下图,其中客户端应用程序总是与主节点和主节点交互,然后将数据复制到辅助节点。
副本集特征- N个节点的集群
- 任何节点可为原发/主节点
- 所有的写操作进入到主节点
- 自动故障转移
- 自动恢复
- 协商一致选择主节点
建立一个副本集
将独立的 mongod 实例转换为副本集,步骤如下:
1、关闭已经运行的 MongoDB 服务器。
2、现在,通过指定--replSet选项启动 MongoDB 服务器。--replSet 的基本语法如下:
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
3、现在打开启动命令提示符,然后连接到mongod实例
4、在Mongo的客户端使用命令rs.initiate()来启动一个新的副本集
5、要检查副本设置配置,则使用命令rs.conf()
6、要检查副本集发行的状态,使用命令rs.status()
示例:
mongod --port 27017 --dbpath "D:\MongoDB\data" --replSet rs0
17、MongoDB创建备份
要使用 mongodump 命令来执行 MongoDB 数据库备份。此命令将转储服务器的所有数据到转储目录。有许多可用的选项,通过它可以限制数据量或创建远程服务器备份。
语法:mongodump
示例:
启动 mongod 服务器。假设 mongod 服务器运行在本地主机和端口 27017. 现在打开一个命令提示符,然后转到你的MongoDB实例的bin目录,然后输入命令mongodump。
该命令将连接到服务器127.0.0.1和端口27017,并备份所有数据到服务器上的目录: /bin/dump/目录。
能够与mongodump可用的选项命令列表如下:
18、数据恢复
要恢复备份的MongoDB数据,则使用mongorestore命令。该命令将从备份目录恢复所有的数据。
语法:mongorestore
文本部分内容参考:
https://www.yiibai.com/mongodb/mongodb_quick_guide.html