Mongodb的安装与使用(从入门到放弃)

大耗子 2020年06月16日 113次浏览

文章链接:https://codemouse.online/archives/2020-06-16174938

为什么要用NoSQL

随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求。虽然关 系型数据库已经在业界的数据存储方面占据不可动摇的地位,但是由于其天生的几个限制,使其很难满足上面这几个 需求:扩展困难、读写慢、成木高、有限的支撑容量。但是 NOSQL关注的是对数据高并发地读写和对海量数据的存储 等,与关系型数据库相比,它们在架构和数据模型方面做了ˆ减法,而在扩展和并发等方面做了”加法”。

逻辑关系

关系型数据库: MySQL数据库(database), 表(table), 记录(rows)三个层次 概念组成。
非关系型数据库: MongoDB数据库(database), 集合(collection), 文档对象 (document)三个层次。

安装与配置

**MongoDB安装 **

#下载MongoDB 
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.2.6.tgz 
#解压.压缩包 
tar -zxvf mongodb-linux-x86_64-ubuntu1604-4.2.6.tgz
#将解压包拷贝到指定目录 
sudo mv mongodb-linux-x86_64-ubuntu1604-4.2.6 /opt/mongodb 
# 创建数据库文件夹(默认的数据库文件的位置是/data/db,启动时会自动创建) 提示:mongodb没有具体的安装过程,解压文件包后,可以直接使用,非常高效和方便。 

MongoDB初始设置

#创建文件夹或文件 
#创建目录 
sudo mkdir -p /data/db 
#创建目录 
sudo mkdir -p /opt/mongodb/logs 
#创建空文件! 注意不是目录而是文件 
sudo touch /opt/mongodb/logs/mongodb.log 

#配置
#在mongodb安装位置/bin目录(/opt/mogodb/bin) 
sudo vim /opt/mogodb/bin/mongodb.conf 
#数据文件存放目录 
dbpath=/data/db 
#日志文件存放目录 
logpath=/opt/mongodb/logs/mongodb.log 
#以守护程序的方式启用,即在后台运行 
fork=true 
#远程连接 
bind_ip=0.0.0.0

MongoDB启动

#启动服务端 
#必须有libcurl共享库,不然无法启动
sudo apt install libcurl3
#运行mongod命令 
sudo /opt/mongodb/bin/mongod 
#后台启动mongodb 
sudo /opt/mongodb/bin/mongod --config /opt/mongodb/bin/mongodb.conf 

#启动客户端 
#运行mongo命令 
sudo /opt/mongodb/bin/mongo

注意:不要用kill -9 PID来杀死MongoDB进程,这样可能回导致MongoDB的数据损坏, 用kill -2杀死进程
-9强制结束 -2能够保存相关数据才退出

启动命令常用参数选项说明

--dbpath 指定数据库的目录 
--port 指定数据库的端口,默认是27017 
--bind_ip 绑定IP 
--directoryperdb 为每个db创建一个独立子目录
--logpath 指定日志存放目录 
--logappend 指定日志生成方式(追加/覆盖) 
--pidfilepath 指定进程文件路径,如果不指定,将不产生进程文件 
--keyFile 集群模式的关键标识 
--journal 启用日志 
--nssize 指定.ns文件的大小,单位MB,默认是16M,最大是2GB 
--maxConns 最大的并发连接数 
--notablescan 不允许进行表扫描 
--noprealloc 关闭数据文件的预分配功能 
--fork 以后台 Daemon形式运行服务

可视化工具

Navicat for MongoDB http://www.navicat.com.cn/what-is-navicat-for-mongodb
MongoDB Compass Community https://www.mongodb.com/download-center/compass
NoSQLBooster(mongobooster) https://nosqlbooster.com/downloads
ClusterControl https://severalnines.com/download-clustercontrol-database-management-system
Mongo Management Studio http://mms.litixsoft.de/index.php?lang=de/
Nosqlclient https://github.com/nosqlclient/nosqlclient

MongoDB数据类型

MongoDB的文档使用BSON( Binary JSON)来组织数据, BSON类似于JSON, JSON只是一种简单的表示数据的方式,只包含了6种数据类型 (null、布尔、数字、字符串、数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期、32位数字、64位数宇等类型。
null:null类型用于表示空值或不存在的字段。如: {“one”: null}
布尔类型:布尔类型有两个值, 'true'和 'false'。如: {“one”: true}
32位整数: mongoDB的控制台使用JS引擎进行输入,而JS仅支持64位浮点数,所以32位整数将会被自动转义。
64位整数: 64位整数与32位整数一样,在 MongoDB控制台使用时,会转义成64位浮点数。
64位浮点数:MongoDB控制台数字的默认类型。如: {“one”: 2.02} {“one”: 10}
字符串: UTF-8字符串都可以表示为字符串类型的数据。如: {“one”: “Hello world”}
符号:在 MongoDB控制台中不支持这种类型,将自动转义成字符串。
日期:注意:使用的时候要加上new。如:{“one”: new Date()}
代码:文档中可以包含JS代码。如: {“one”: function(){/... ... ... .../}}
正则表达式:文档键值可以包含正则表达式,其正则表达式采用JS语法来表示。如: {“one”: ho/i}
数组:文档中键值可以表示为数组,在数组内还可以嵌套数组。如: {“x” [“a”, ”b” [“c”, ”d”]]}
内嵌文档:文档可以包含别的文档,也可以作为值嵌入到父文档中。如: {“x”: {“name”: “Tom”, “age”:20}}

MongoDB语句

常用增删改查

#创建数据库
use mousetest  
#创建集合 
db.createCollection("teacher") 

#添加数据 
db.teacher.insert({description:'Linux高级架构师', course:'Linux', name:'king'}) 
db.teacher.insertOne({description:'MongoDB', course:'Linux', name:'milo'}) 
db.teacher.insertMany({}) 
#查询 
db.teacher.find() 
#修改 
db.teacher.update({'name':'king'},{$set:{'description':'Linux后台架构师'}}) 
#删除 
db.teacher.remove({name:"king"}) db.teacher.deleteOne({'name':'milo'}) 
db.teacher.deleteMany({})

条件查找

#MongoDB AND 条件 
db.col.find({key1:value1, key2:value2}).pretty() 
db.col.find({"by":"华北科技学院", "title":"MongoDB教程"}).pretty() 
#MongoDB OR 条件 
db.col.find( { $or: [{key1: value1}, {key2:value2}] } ).pretty() 
db.col.find({$or:[{"by":"华北科技学院"},{"title": "MongoDB教程"}]}).pretty() 
#AND 和 OR 联合使用 
db.col.find({"likes": {$gt:50}, $or: [{"by": "华北科技学院"},{"title": "MongoDB教程"}]}).pretty()

常用的管道聚合函数

$group 将collection中的document分组,可用于统计结果
$match 过滤数据,只输出符合结果的文档
$project 修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等)
$sort 将结果进行排序后输出
$limit 限制管道输出的结果个数
$skip 跳过制定数量的结果,并且返回剩下的结果
$unwind 将数组类型的字段进行拆分

#查看类型
db.teacher.find({"name" : {$type : 2}})  
db.teacher.find({"name" : {$type : 'string'}}) 
#查看哪部分(可用于筛选前x条。。)
db.teacher.find({}).limit(1) 
#跳过某条
db.teacher.find({}).skip(1) 
#排序显示
#其中 1 为升序排列,而 -1 是用于降序排列 
db.teacher.find().sort({"sex":-1}) 

#可用来做聚合
db.teacher.aggregate([
{
	$group : {
		_id : "$name", 
		num_tutorial : {$sum : 1}
	}
}]) 

{ "_id" : "king", "num_tutorial" : 1 } 
{ "_id" : "milo", "num_tutorial" : 1 }

表达式操作符

$sum 计算总和,{$sum: 1}表示返回总和×1的值(即总和的数量),使用{$sum: '$制定字段'}也能直接获取制定字段的值的总和
$avg 平均值
$min min
$max max
$push 将结果文档中插入值到一个数组中
$first 根据文档的排序获取第一个文档数据
$last 同理,获取最后一个数据

索引

唯一索引(Unique):唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性。
稀疏索引(Sparse):只包含有索引字段的文档的条目,即使索引字段包含一个空值。也就是说可以跳过那些索引键不存在的文档。
TTL索引 :每个文件设置一个超时时间,文档到达预设的老化程序之后就会被删除。
全文本索引:全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的 索引进行查找,并将查找的结果反馈给用户的检索方式。
地理空间索引:2dshpere索引(用于地球表面类型的地图) 2d索引(用于平面地图和时间连续的数据)
使用GridFS存储文件: 用来存储大型二进制文件

索引操作

1、创建索引
db.col.createIndex({"title":1})
2、查看集合索引
db.col.getIndexes()
3、查看集合索引大小
db.col.totalIndexSize()
4、删除集合所有索引
db.col.dropIndexes()
5、删除集合指定索引
db.col.dropIndex("索引名称")

explain()和hint()

  • explain: 提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化。

    • queryPlanner.namespace一个字符串,指定运行查询的命名空间(即.)。
    • queryPlanner.indexFilterSet boolan值,表示MongoDB 对于此query shape 是否使用了索引过滤器。
    • queryPlanner.winningPlan 文档类型,详细显示查询优化程序选择的查询计划。
    • winningPlan.stage 阶段名称。每个阶段都有每个阶段特有的信息。 例如,IXSCAN 阶段将包括索引边界以及特定于索引扫描的其他数据。 如果阶段具有 子阶段或多个子阶段,则阶段将具有inputStage 或 inputStages。
    • winningPlan.inputStage 描述子阶段的文档。它为其父级提供文档或索引键。 如果父级只有一个子级,则该字段存在。
    • winningPlan.inputStages 描述子阶段的数组。子阶段为父阶段提供文档或索引键。 如果父级具有多个子节点,则该字段存在。 例如,$or 表达式或索引 交集的阶段消耗来自多个源的输入。
    • queryPlanner.rejectedPlans 查询优化器考虑和拒绝的候选计划数组。 如果没有其他候选计划,则该数组可以为空。
    • db.teacher.find().explain()
  • hint: 强制 MongoDB 使用一个指定的索引

    db.users.find({gender:"M"}{user_name:1,_id:0}).hint({gender:1,user_name:1})

开发实战

mongo-c-driver驱动安装
官方驱动网址:https://docs.mongodb.com/drivers/c/
驱动github位置:https://github.com/mongodb/mongo-c-driver

mkdir cmake-build 
cd cmake-build 
Make 
Make install 

引入头文件: #include <mongoc.h>

编译:
gcc -o mongo_test mongo_test.c -L/usr/local/lib -I/usr/local/include/libmongoc-1.0 - I/usr/local/include/libbson-1.0 -lmongoc-1.0 -lbson-1.0