文章链接:https://codemouse.online/archives/2020-06-16174938
随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求。虽然关 系型数据库已经在业界的数据存储方面占据不可动摇的地位,但是由于其天生的几个限制,使其很难满足上面这几个 需求:扩展困难、读写慢、成木高、有限的支撑容量。但是 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的文档使用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}}
#创建数据库
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 }
KaTeX parse error: Expected '}', got 'EOF' at end of input: sum 计算总和,{sum: 1}表示返回总和×1的值(即总和的数量),使用{ s u m : ′ sum: ' 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
: 提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化。
- 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
编译:
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