一 MongoDB的简介
1 MongoDB是什么
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的
它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等
关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念
MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦
2 MongoDB数据存储格式
JSON格式
JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。
MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。JSON数据库语句可以容易被解析。
BSON格式
SON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
二进制的JSON,JSON文档的二进制编码存储格式
BSON有JSON没有的Date和BinData
MongoDB中document以BSON形式存放
db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});
3 MongoDB适用场景
网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及JSON数据的存储。
4 与关系型数据库的概念映射
表 table Collection
字段 Colum Fields
行 Row Documents
二 MongoDB安装与部署
1 安装
MongoDB官网:https://www.mongodb.com/
CentOS7.X版本软件下载地址https://www.mongodb.org/dl/linux/x86_64-rhel7
在root用户下操作 # 该方法仅限与CentOS系统使用
cat >> /etc/rc.local <<'EOF' if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi EOF
Transparent Huge Pages (THP),通过使用更大的内存页面,可以减少具有大量内存的机器上的缓冲区(TLB)查找的开销。
但是,数据库工作负载通常对THP表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP,以确保MongoDB的最佳性能。
创建用户
groupadd -g 800 mongod useradd -u 801 -g mongod mongod
修改用户密码
echo 123456 |passwd --stdin mongod
创建程序目录
mkdir -p /application/mongodb/ && cd /application/mongodb/ && mkdir -p bin conf log data
下载程序
cd /application/mongodb/ wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz
解压程序
tar xf mongodb-linux-x86_64-3.2.8.tgz cd mongodb-linux-x86_64-3.2.8/bin/ && cp * /mongodb/bin
修改程序属主
chown -R mongod:mongod /application/mongodb
切换到mongod用户,设置用户环境变量
su - mongod cat >> .bash_profile <<'EOF' export PATH=/mongodb/bin:$PATH EOF source .bashprofile
2 管理MongoDB
启动:mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork 关闭:mongod --shutdown --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
3 登录数据库
[mongod@MongoDB ~]$ mongo MongoDB shell version: 3.2.8 connecting to: test >
4 使用配置文件的方式管理数据库
cd /application/mongodb/conf/ [mongod@MongoDB conf]$ vim mongod1.conf dbpath=/application/mongodb/data logpath=/application/mongodb/log/mongodb.log port=27017 logappend=1 fork=1 使用配置文件时的启动与关闭: 启动:mongod -f mongod1.conf 关闭:mongod -f mongod1.conf --shutdown
三 MongoDB的基本操作
Mongodb中关键字种类:
db(数据库实例级别)
db本身
db.connection 数据库下的集合信息
db.collection.xxx(
rs(复制集级别)
sh(分片级别)
1 查询操作
在客户端指定数据库进行连接:
[mongod@MongoDB ~]$ mongo 10.0.0.152/admin MongoDB shell version: 3.2.8 connecting to: 10.0.0.152/admin > db admin
查看当前数据库版本
> db.version() 3.2.8
切换数据库
> use test;
switched to db test
显示当前数据库
> db test > db.getName() test
查询所有数据库
> show dbs; clsn 0.000GB local 0.000GB test 0.000GB > show databases; clsn 0.000GB local 0.000GB test 0.000GB
查看clsn数据库当前状态
> use clsn; > db.stats() { "db" : "clsn", "collections" : 1, "objects" : 10000, "avgObjSize" : 80, "dataSize" : 800000, "storageSize" : 258048, "numExtents" : 0, "indexes" : 1, "indexSize" : 94208, "ok" : 1 }
查看当前数据库的连接机器地址
> db.getMongo() connection to 127.0.0.1
2 数据库管理
创建数据库
当use的时候,系统就会自动创建一个数据库。如果use之后没有创建任何集合。系统就会删除这个数据库。
> use clsn;
删除数据库
> show dbs; clsn 0.000GB local 0.000GB test 0.000GB > use clsn switched to db clsn > db.dropDatabase() { "dropped" : "clsn", "ok" : 1 }
3 创建集合
方式一:
> use clsn; switched to db clsn > db.createCollection('a') { "ok" : 1 } > db.createCollection('b') { "ok" : 1 } 查看当前数据下的所有集合 > show collections; a b > db.getCollectionNames() [ "a", "b" ]
方式二:
当插入一个文档的时候,一个集合就会自动创建。 > use clsn; switched to db clsn > db.c.insert({name:'clsn'}); WriteResult({ "nInserted" : 1 }) > db.c.insert({url:'http://blog.nmtui.com'}); WriteResult({ "nInserted" : 1 }) 查看集合里的内容 > db.c.find() { "_id" : ObjectId("5a4cbcea83ec78b7bea904f8"), "name" : "clsn" } { "_id" : ObjectId("5a4cbcfc83ec78b7bea904f9"), "url" : "http://blog.nmtui.com" }
4 添加数据
db.tablename.insert({'key':'value'}) 官方推荐的写法: #在图形化客户端和数据库中是这个写法 db.table.insertOne({'key':'value'}) db.table.insertMany({k1:v1},{k2:v2},,{k3:v3}) #在pycharm中的写法为 db.tablename.insert_one({}) db.tablename.insert_many({},{},{})
5 删除数据
db.tablename.remove({k:v}) db.tablename.remove({age:34}) #删除所有age=34的数据 官方推荐的写法: #数据库和图形化操作写法 db.tablename.deleteOne() #删除符合条件的第一条数据 db.tablename.deleteMany() # 删除符合条件的所有数据 #在pycharm中的写法为 db.tablename.delete_one({}) db.tablename.delete_many({},{},{})
6 更新数据
#查询出name为xx的数据,将符合条件的一条数据进行修改 db.tablename.update({name:'xx'},{$set:{age:23}}) $set -set修改器 强制替换覆盖 官方推荐写法 #数据库和图形化操作的写法 #更新符合条件的第一条数据,第一条数据就是你第一个插入的数据 db.tablename.update_many({},{}) array(数组,列表) + object(字典) :db.tablename.updateOne({cp.name:'装X'},{$set:{cp.$.score:'100'}}) #此处cp.$.score,$的意思为前面查询出的索引
7 查询操作
db.filename.find() #查询所有数据 db.user.find({name:xixi}) #查询出name为xixi的数据 #查询符合条件的一条数据 db.tablename.findOne({k:v})
四 MongoDB的数据类型
ObjectId :Documents 自动生成的 _id _id:ObjectId("5cb69a23815ea7295f8bad43") 自动生成的 json数据中不包含ObjectId类型 id类型uuid String: 字符串,必须是utf-8 Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写) Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32) Double:浮点数 (没有float类型,所有小数都是Double) Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦) Object:深度<=4 如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典 Null:空数据类型 , 一个特殊的概念,None Null Timestamp:时间戳 通常不用这个数据类型 如果存储时间 Double Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
五 查询关键字
array数据类型会自动遍历 $in 或者等于相同字段 db.filename.fiind({age:{$in:[19,109]}}) #就是age=19或age=109的数据 $or 或者等于不同字段 db.filename.find({$or:[{age:19},{age:109}] }) #也是age=19或age=109的数据,与$in不同之处在于 ,$in写的必须是相同的字段,而$or可以写不同的字段 $and or 逗号 -- 并列条件 $all --Array 数据类型 子集查询 db.filename.find({hobby:{$all : [ 'cs','harry' ]}})
六 修改器
数学比较:
$lt : 小于 √ $lte: 小于等于 √ $gt : 大于 √ $gte: 大于等于 √ $ne : 不等于 $eq or 冒号 : 等于
$set -- set修改器 强制替换覆盖
db.user.updateOne({name:"harry"},{$set:{name:"cs"}})
$unset -- 强制删除字段
db.user.updateOne({name:"harry"},{$unset:{gender:0}})
$inc -- 引用增加 #就相当于我查询出的数据进行增加,没有减,如果想实现减的操作,加负的即可
db.user.updateOne({name:"harry"},{$inc:{age:1}}) # 年龄加1
array操作:
$push 相当于append 在array中追加
db.user.updateOne({name:"harry"},{$push:{hobby:"养生"}}) # 添加一个元素 db.user.updateOne({name:"harry". hobby:"养生"},{$set:{"hobby.$":"健身养生"}}) # 把养生修改成健身养生 $:满足前置条件列表元素的下标索引
$pushAll 相当于extend 在array中追加列表中的所有元素
db.user.updateOne({name:"harry"},{$pushAll :{hobby:["养生", "健身"]}})
$pull 相当于remove 在array中删除一个元素
db.user.updateOne({name:"harry"},{$pull:{hobby:"游戏"}})
$pullAll 在array中删除一堆元素
$pop 相当于pop 删除第一个 -1 或 最后一个 1 的值
{$pop:{myczdyy:-1}} 在myczdyy中删除第一个元素
{$pop:{myczdyy:1}} 在myczdyy中删除最后一个元素
混搭用法示例:
db.user.updateOne({name:'cs'},{$set:{course:[ {course_name:"Python", score:101}, {course_name:"Vue.js", score:2}, {course_name:"Mysql", score:98} ]}}) db.user.updateOne({name:"cs", "course.course_name":"Vue.js"}, {$inc:{"course.$.score":10}}) # 把VUE的成绩+10
七 sort(排序) skip(跳过) limit(选取条目)
sort 排序
#找到name为xixi的数据,根据age排序 db.filename.find({name:xixi}).sort({age:18}) #找到name为xixi的数据,根据age排序,如果age有相同的,再根据birthday倒序排序 db.filename.find({name:xixi}).sort({age:18,birthday:-1})
skip 跳过
#找到name为xixi的数据,然后根据插入顺序跳过第一条 db.filename.find(name:xixi).skip(1)
limit 选取条目
#找到name为xixi的数据,根据插入顺序选取出3条数据展示 db.filename.find({name:xixi}).limit(3)
sort,limit,skip是有执行顺序的
先排序(sort),在跳过(skip),最后显示条目(limit)
实现分页:
(page-1)*num
db.filename.find({name:xixi}).skip((page-1)*num).limit(num)
八 pymongo
安装 pip install pymongo
# 创建客户端
mongo_client = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mongo_client['my_mongo_db']
# 查询数据
res = mongo_db.user.find() # cursor对象 可被迭代 for i in res: print(i)
# 查询单条数据
res = mongo_db.user.find_one()
# 带条件查询
res = mongo_db.user.find_one({"name":"cs"})
# 插入数据
res = mongo_db.user.insert_one({"name":"harry"}) res = mongo_db.chat.insert_one({})
# 插入多条
res = mongo_db.user.insert_many([{'name':'harry'}, {'name':'sam'}, {'name':'jerry'}])
# 修改数据
res = mongo_db.user.update_one({"name":"jerry"},{"$set":{"age":999}}) # 返回UpdateResult对象
# 修改多条
res = mongo_db.user.update_many({"age":{"$gte":0}}, {"$set":{"age":888}}
# 删除
res = mongo_db.user.delete_one({"name":"sam"}) # 删除一条数据