MongoDB入门

MongoDB

MongoDB数据库数据结构

数据组织结构:键值对 --> 文档 --> 集合 --> 数据库

e.g.

-----------------------------------
    ID    |    Name    |    Age    
-----------------------------------
     1    |    Lily    |     17    
-----------------------------------
     2    |    Lucy    |     18    
-----------------------------------

{
	'ID':1
	'Name':Lily
	'Age':17
}
{
	'ID':2
	'Name':Lucy
	'Age':18
}

基本概念对比

mysqlmongodb含义
databasedatabase数据库
tablecollection表/集合
columnfield字段/域
rowdocument记录/文档
indexindex索引

数据类型

  • 整型 int
  • 浮点型 double
  • 布尔 boolean
  • 字符串 string: utf-8字符串
  • ObjectId:ID对象 自动生成的不重复值

命令

# 进入交互界面
mongo 
# 设置MongoDB基本信息
# mongod 
mongod -h # 查看帮助
mongod --port [port] # 设置MongoDB的端口为port,默认端口27017
mongod --dbpath [dir] # 将dir设置为数据库存储目录
# 数据库的备份和恢复命令
# 备份
mongodump -h [host] -d [db] -o [path]

e.g.

mongodump -h 'localhost' -d stu -o ./db 
# 将本机 stu 数据库备份在 当前目录下的db文件夹中
# 恢复
mongorestore -h [host:port] -d [db] [bak]

e.g.

mongorestore -h 127.0.0.1 -d student stu 
# 将stu备份 恢复到本机student数据库中
mongostat # 查看数据库的运行状态
mongotop # 查看数据库集合读写时长,得到每个集合在1s内的读写时间
-- 库、集合管理
use database
show dbs 
db.dropDatabase()
-- 全局变量db:代表当前正在使用的数据库
db.createCollection(collectionName)
db.collection.insert(...) -- 插入数据时集合不存在则自动创建
show collections
show tables
db.collection.drop()
db.collection.renameCollection(newName)
-- 查找
db.collection.find(query, field) -- 查找所有符合条件的文档
db.class0.find({age:18}, {_id:0, name:1, age:1})
db.collection.findOne(query, field) -- 查找第一个符合条件的文档
-- query操作符使用
-- 比较操作符:
$eq, $lt, $lte, $gt, $gte, $ne, $in, $nin
db.class0.find({age:{$eq:18}}, {_id:0})
db.class0.find({name:{$lt:'Tom'}}, {_id:0})
db.class0.find({age:{$gt:17, $lt:20}}, {_id:0})
db.class0.find({age:{$in:[17,19,21]}}, {_id:0})
db.class0.find({age:{$nin:[17,19,21]}}, {_id:0})

-- 逻辑操作符: 
$and, $or, $not, $nor
db.class0.find({$and:[{age:{$gt:17}},{sex:'m'}]}, {_id:0})
db.class0.find({name:{$lt:'Lily'},age:{$in:[17, 19]}}, {_id:0}) -- query中多个条件本身也表示并且关系

db.class0.find({$or:[{age:{$lt:18}},{age:{$gt:19}}]}, {_id:0})
db.class0.find({age:{$not:{$gt:18}}}, {_id:0})
db.class0.find({$nor:[{age:{$gt:18}},{sex:'m'}]},{_id:0})
-- 混合语句:多个逻辑组合使用
-- 数组操作符
-- 查找数组中包含元素
db.class2.find({score:69}, {_id:0})
db.class2.find({score:{$gt:90}}, {_id:0})

$all --查找数组中同时包含多项
db.class2.find({score:{$all:[87, 89]}},{_id:0})

$size -- 根据数组中元素个数查找
db.class2.find({score:{$size:3}},{_id:0})

$slice -- 用于field参数,表示查找哪些项
db.class2.find({},{_id:0, score:{$slice:2}}) -- 查找前两项 
db.class2.find({},{_id:0, score:{$slice:[1,2]}}) -- 跳过前1项,查找后2项
db.class2.find({},{_id:0, score:{$slice:[1,1]}}) -- 跳过前1项,查找后1项

-- 通过数组索引查找   '数组名.索引'
db.class2.find({'score.1':{$gt:80}}, {_id:0}) -- 查找数组第二项大于80的,通过score.1表示第二项,必须加引号
-- 其他操作符
$exists:boolean  --  boolean 为真,则查找包含某域的文档;否则,查找不包含某域的文档
db.class0.find({sex:{$exists:true}}, {_id:0}) -- 查找有sex域的文档

$mon -- 根据除数余数筛选
db.class0.find({age:{$mod:[2,1]}},{_id:0}) -- 查找年龄是奇数的文档

$type -- 根据数据类型筛选, 数据类型与相应值查看type表
db.class0.find({age:{$type:2}}, {_id:0}) -- 查找年龄域的值是字符串类型的文档
-- 数据操作函数
distinct(field) -- 获取某集合中某个域的值范围,返回的是一个数组
db.class0.distinct('age') -- 此处必须有引号
pretty() -- 将find结果格式化显示
db.class0.find().pretty()
limit(n) -- 显示查询结果的前n条
db.class0.find({},{_id:0}).limit(3)
skip(n) -- 跳过前n条,显示后面的文档
db.class0.find({},{_id:0}).skip(5)
count() -- 统计查询结果数量
db.class0.find({age:18},{_id:0}).count() -- 不给查询条件可能会出错
sort({field:1/-1}) -- 将查询结果根据field排序,1:升序,-1:降序
db.class0.find({age:{$gt:17}}, {_id:0}).sort({age:1})
-- 复合排序,前一项相同则按后一项排序
db.class0.find({}, {_id:0}).sort({age:-1, name:1})
-- 通过序列号获取集合的某个文档
db.class0.find({},{_id:0})[1]
db.class0.find({},{_id:0}).sort({age:-1})[2]
-- 函数连续调用 -- 前面函数的返回结果仍然为一个集合时,可以继续调用下一个操作函数
db.class0.find({age:{$type:1}}, {_id:0}).sort({age:-1}).limit(3)
-- 增加
db.collection.insertOne(doc) -- 插入一条文档
db.class0.insertOne({'name':'Lucy', 'age':18, 'sex':'w'})
db.collection.insertMany([{}, {}, ...]) -- 插入多条文档
db.collection.insert() -- 插入一条或多条文档,id已存在,则插入失败
db.collection.save() -- 插入一条或多条文档,id已存在,会替换原来文档
db.getCollection('class') -- 获取集合对象
-- 修改
-- 修改函数
updateOne(query, update, upsert) -- 修改第一个复合条件的文档 
db.class0.updateOne({name:'Tom'},{$set:{age:16}})
db.class0.updateOne({name:'Mike'},{$set:{age:20}},{upsert:true})

updateMany(query, update, upsert) -- 修改所有符合条件的文档
db.class0.updateMany({age:20},{$set:{sex:'m'}})
update(query, update, upsert, multi) -- multi 默认只修改一个文档,multi=true表示修改所有符合条件文档
db.class0.update({name:'Kate'},{$set:{age:21, sex:'w'}},true, true)

findOneAndUpdate(query, update) -- 功能:查找到一个文档并修改,返回值:会返回修改前的文档
db.class0.findOneAndUpdate({name:'Carl'},{$set:{age:19}})
findOneAndReplace(query, doc) -- 功能:查找一个文档并替换,返回值:返回原文档
db.class0.findOneAndReplace({name:'Tom', age:17},{name:'Sahra', age:20, sex:'w'})
-- 修改操作符
$set -- 修改一个域的值,或者增加一个域
db.class0.updateOne({sex:{$exists:false}},{$set:{sex:'m'}})
db.class0.updateOne({sex:{$exists:false}},{$set:{age:20, sex:'m'}}) -- 可以同时修改多个域

$unset -- 删除一个域
db.class0.updateOne({name:'Tom'},{$unset:{sex:''}})

$rename -- 给域重命名
db.class0.updateMany({},{$rename:{sex:'gender'}})

$setOnInsert -- 如果使用update*执行了插入文档操作,则其插入的内容才能插入;否则无法插入
db.class0.updateOne({name:'David'},{$set:{age:18}, $setOnInsert:{gender:'m'}},{upsert:true})

$inc -- 加法修改器
db.class1.updateMany({},{$inc:{age:1}})

$mul -- 乘法修改器
db.class1.updateMany({},{$mul:{age:2}})
-- $inc, $mul 操作数可以是整数、小数、正数、负数

$max -- 修改某个域的值,如果小于指定值,则修改为指定值;大于则不变
db.class1.updateMany({},{$max:{age:30}})

$min -- 修改某个域的值,如果大于指定值,则修改为指定值;小于则不变
db.class1.updateMany({},{$min:{age:25}})
-- 数组修改器
$push -- 向数组中添加一项
db.class2.updateOne({name:'小红'},{$push:{score:10}})
$pushAll -- 向数组中添加多项
db.class2.updateOne({name:'小明'},{$pushAll:{score:[10,37]}})
$pull -- 从数组中删除某个值
db.class2.updateOne({name:'小刚'},{$pull:{score:90}})
$pullAll -- 从数组中删除多个值
db.class2.updateOne({name:'小明'},{$pullAll:{score:[69,5]}})
$pop -- 弹出数组中一项,即删除,1 表示弹出最后一项,-1 表示弹出第一项
db.class2.updateOne({name:'小红'},{$pop:{score:1}})
$addToSet --向数组中添加一项,但是不能与已有的数值重复
db.class2.updateOne({name:'小刚'},{$addToSet:{score:80}})
$each -- 对多个值逐一操作
db.class2.updateOne({name:'小红'},{$push:{score:{$each:[90,10]}}})
$position -- 指定数据插入位置,需要配合$each
db.class2.updateOne({name:'小刚'},{$push:{score:{$each:[90], $position:1}}})
$sort -- 给数组排序,需配合$each使用, 1 升序,-1 降序
db.class2.updateOne({name:'小红'},{$push:{score:{$each:[],$sort:-1}}})
-- 删除
db.collection.deleteOne(query) -- 删除第一个复合条件文档
db.class0.deleteOne({gender:{$exists:false}})
db.collection.deleteMany(query) -- 删除所有不符合条件的文档
db.class0.deleteMany({age:{$lt:18}})
db.collection.deleteMang({}) --删除集合中所有文档
db.collection.remove(query, justOne) -- 删除一个或多个文档,
-- justOne默认为false,表示删除所有;若justOne=true,只删除一个复合条件的文档
db.class0.remove({gender:'m'},true)
db.collection.findOneAndDelete(query) -- 查找一个文档并删除,会返回查找到的文档
db.class0.findOneAndDelete({name:'Sahra'})

其他数据类型

时间类型

-- 自动生成当前时间,格式是ISO标准时间
new Date() ----> ISODate("2019-04-19T06:14:39.500Z")
-- 获取计算机当前时间生成字符串
Date() ----> "Fri Apr 19 2019 14:15:58 GMT+0800 (CST)" 
-- 时间函数
ISODate()
ISODate() ----> ISODate("2019-04-19T06:26:19.500Z")
ISODate('20190101') ----> ISODate("2019-01-01T00:00:00Z")
-- 时间戳
valueOf() -- 将标准时间转化为时间戳
ISODate().valueOf() ----> 1555655288955

null 类型

null -- 表示某个域的值为空
db.class1.insertOne({book:'python',price:null}) -- 插入时设定某个域值为空
db.class1.find({price:null},{_id:0}) -- 查找到price域为null、或者没有该域的文本档,注意与下面语句区别
db.class1.find({price:{$exists:false}},{_id:0}) -- 只查找不存在price域的,不会查找price域值为null的

内部文档 (Object类型)

-- 定义:文档中某个域的值为内部文档,则该值为object类型数据
-- 使用:当使用内部文档某个域的值时, 利用 '外部域.内部域' ,此格式必须要有引号,表示为字符串,数组也是如此
db.class3.find({"intro.author":'曹雪芹'},{_id:0})
db.class3.updateOne({book:'西游记'},{$set:{'intro.price':42}})

索引操作

-- 创建索引
db.collection.createIndex(index, option)
db.class0.createIndex({name:1})
-- _id域由系统自动生成索引
-- 1 表示正序,-1 表示倒序

-- 通过option设置索引属性
-- 定义索引名称
db.class0.createIndex({age:1},{name:'ageIndex'}) -- 索引名称

-- 其他索引
-- 复合索引 -- 根据多个域创建一个索引
db.class0.createIndex({name:1, age:-1})、
object/数组索引 -- 将值为数组或文档的域设为索引
-- 如果对object域或者数组域创建索引,则针对object或者数组中某个元素的查询,也是索引查找,会提高查找效率

-- 唯一索引 -- 要求创建索引的域不能有重复的值
db.class0.createIndex({name:1},{unique:true})

-- 稀疏索引 -- 如果创建稀疏索引则对没有索引域的文档会忽略
db.class0.createIndex({age:1},{sparse:true, name:'ageIndex'})

-- 其他索引创建方法
ensureIndex() -- 用法同 createIndex()
createIndexes([{},{}, ...]) -- 同时创建多个索引
-- 查看索引
db.class0.getIndex()

-- 删除索引
db.collection.dropIndex(index or name) -- 通过索引键值对或索引名称删除一个索引
db.class0.dropIndex({age:1})
db.class0.dropIndex('ageIndex')
-- 删除所有索引,_id 索引不会被删除
db.collection.dropIndexes()

聚合操作:对文档进行数据整理统计,得到统计结果

-- 集合函数
db.collection.aggregate() -- 执行聚合操作,参数:聚合条件,需配合聚合操作符使用

-- 聚合操作符
$group -- 分组聚合, 一般配合统计操作符
$sum -- 求和
db.class0.aggregate({$group:{_id:'$gender', num:{$sum:1}}}) -- 加1,按性别分组,统计人数
db.class0.aggregate({$group:{_id:'$gender', num:{$sum:'$age'}}}) -- 按性别分组,求每组总年龄
$avg -- 求平均
db.class0.aggregate({$group:{_id:'$gender', num:{$avg:'$age'}}}) -- 按性别分组,求平均年龄
$max/$min -- 求最大/最小值
db.class0.aggregate({$group:{_id:'$gender', num:{$max:'$age'}}})
db.class0.aggregate({$group:{_id:'$gender', num:{$min:'$age'}}})
$first/$last -- 求第一个/最后一个值
db.class0.aggregate({$group:{_id:'$gender', num:{$first:'$age'}}})
db.class0.aggregate({$group:{_id:'$gender', num:{$last:'$age'}}})
$match -- 筛选数据
-- $match操作的值的写法基本等同于query参数
db.class0.aggregate()
db.class0.aggregate({$match:{age:{$gt:18}}})
$limit -- 获取集合中前几条文档
db.class0.aggregate({$limit:3})
$skip -- 跳过前几个文档
db.class0.aggregate({$skip:3})
$sort -- 对文档排序
db.class0.aggregate({$sort:{age:1}})
$project -- 选择显示域,值得写法同field
db.class0.aggregate([{$match:{}}, {$project:{_id:0, name:1, age:1}}])
db.class0.aggregate([{$match:{}}, {$project:{_id:0, Name:'$name', Age:'$age'}}])
-- 聚合管道:将前一个聚合产生的结果交给后一个聚合继续操作,直到最后结束
db.class0.aggregate([{},{},{}, ...])
db.class0.aggregate([{$sort:{age:-1}},{$limit:3}]) -- 查找年龄最大的三个同学
db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}]) -- 查找同名同学

固定集合

mongodb中创建固定大小的集合,称为固定集合

-- 创建固定集合
db.createCollection(collection, {capped:true, size:10000, max:20})
-- capped: 表示创建固定集合, size: 固定集合大小
-- max:固定集合可存放文档数量, 固定集合最终能存的量在size和max中取小,两个参数可以只设置一个
db.createCollection('log',{capped:true, size:1000, max:3})

文件存储

GridFS 文件存储方案:更方便存取mongodb中的大文件(>16 M)

MongoDB数据库中创建两个集合共同存储文件

  • fs.files: 集合中为每个文件建立一个信息文档,存储文件的基本信息
  • fs.chunks: 集合中每个文件建立与 fs.files 的关联,并将文件进行分块存储
--存储方法:
mongofiles -d dbname put file
e.g. mongofiles -d grid put test/picture.jpeg
-- 提取方法:
mongofiles -d dbname get file 
e.g. mongofiles -d grid get test/picture.jpeg

小文件存储

# 导入模块 
import bson
# 将文件内容转换为bson二进制格式存储
content = bson.binary.Binary(bytes)
	# 功能:将python字节串转换为bson格式
	# 参数:要转换的字节串
	# 返回:bson数据
# 将bson数据插入到mongo数据库文档中
dic = {'filename':'test.jpeg','data':content}
myset.insert_one(dic)
# 关闭数据库连接
conn.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值