目录:
一、MongoDB 简介
二、MongoDB 安装部署
三、MongoDB的 增删改查
四、MongoDB的 数据类型
五、MongoDB的 $关键字 及 $修改器 $set $inc $push $pull $pop
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
MongoDB: 启动Mongodb mongod --dbpath "数据库目录" mongod --dbpath c:/data/db 默认端口 27017 show dbs 查看所有存在磁盘上的数据库 show tables 查看当前数据库存在磁盘上的数据表 use 数据库 创建数据库或切换数据库 ######使用了不能存在的对象即创建该对象###### 数据库.表名 创建表 概念: Mysql: id name age duixiang hobby 1 jwb 73 2 2 2 ywb 84 1 null MongoDB: [ { "id":1, "name":"jwb", "age":73, "hobby":["ywb","lwb"], "duixiang":{ "id":2, "name":"ywb", "age":84 } }, { "id":2, "name":"ywb", "age":84, "duixiang":{ "id":1, "name":"jwb", "age":73, } } ] mysql mongodb 数据库 数据库 表 collections 列 Field row documents 数据增删改查 增加 insert #db.user.insert({"id":1,"name":"jwb","age":73}) 官方推荐写法 db.user.insertMany([{}]) db.user.insertOne({}) 查看 find db.user.find() db.user.findOne({}) 并列条件 db.user.find({"id":2,"age":85}) 或条件 $or : db.user.find({$or:[{age:73},{name:"ywb"}]}) 同一个字段的 或条件 $in : db.user.find({age:{$in:[73,84,86]}}) 子集检索 : db.user.find({what:{$in:[2,1]}}) 满足所有条件 $all : db.user.find({what:{$all:[2,1,3]}}) 数学比较符: $gt : 大于 db.user.find({age:{$gt: 73}}) $gte: 大于等于 $lt : 小于 $lte: 小于等于 $eq : 等于 :也是等于 "_id" : ObjectId("5c3e84cf1e235402547fa40c") 更新:update 修改器 $set #db.user.update({"age":84}, {$set:{"username":"jinjiaodawangba"}}) 官方推荐写法: db.user.updateOne({"name":"jwb"},{$set:{"age":99}}) db.user.updateMany({"name":"jwb"},{$set:{"age":99}}) 删除:remove / delete #db.user.remove({"age":85}) 官方推荐写法: db.user.deleteOne({"name":"jwb"}) db.user.deleteMany({"name":"jwb"}) $修改器: $set : 暴力修改 $unset : 暴力删除字段 db.user.updateOne({"name":"ywb"},{$unset:{"hobby":1}}) $inc : 引用增加 在原有值的基础上增加 db.user.updateMany({},{$inc:{age:1}}) array修改器: $push 增加元素 :db.user.updateOne({"name":"ywb"},{$push:{"hobby":"jwb"}}) $pull 删除元素 :db.user.updateOne({"name":"ywb"},{$pull:{"hobby":"jwb"}}) $pushAll 迭代增加 :db.user.updateOne({"name":"ywb"},{$pushAll: {"hobby":[1,2,3]}}) $pop 删除最后一条数据/第一条 : 最后一条 db.user.updateOne({"name":"ywb"},{$pop:{"hobby":1}}) 第一条 db.user.updateOne({"name":"ywb"},{$pop:{"hobby":-1}}) $ 字符: ["hj","tt",1,2] # {"hobby":"hj"} hj 是hobby列表中的第0个元素 就把 0 这个数据放在了 $ 中 db.user.updateMany({hobby:"hj"},{$set:{"hobby.$":"喝酒"}}) ###### $ 存储符合条件的元素下标索引 ###### Object操作 db.user.updateOne({"kecheng.name":"python"},{$set:{"kecheng.price":19800}}) db.user.updateOne({"kecheng.name":"python"},{$inc:{"kecheng.price":500}}) Array中的Object db.user.updateOne({"hobby.age":84},{$set:{"hobby.$.age":73}}) Object中的Array db.user.updateOne({"kecheng.class":15},{$set:{"kecheng.class.$":20}}) 数据类型: ObjectID :Documents 自生成的 _id String: 字符串,必须是utf-8 Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写) Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32) Double:浮点数 (没有float类型,所有小数都是Double) Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦) Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典 Null:空数据类型 , 一个特殊的概念,None Null Timestamp:时间戳 Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型) MongoDB中的跳过选取排序: skip(5) 跳过五条数据 limit(5) 只显示五条数据 分页 skip(5).limit(5) sort({age:1}) 正序 sort({age:-1}) 倒序 如果三个关键字同时出现,优先级: 1.sort 2.skip 3.limit pymongo: find_one insert_one insert_many update_one update_many delete_one delete_many sort("key",1)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
show dbs use db1 show tables # 查找table1前300条数据,且只显示他们的name字段 db.table1.find({}, {'name':1, '_id':0}).limit(300) 创建表: db.createCollection('table1') 将一个表的内容复制到另一个表中: db.table1.copyTo('table2')
一.MongoDB简介
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB和关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等
关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念
MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入
来做一个小例子,进行一个对比
下面我们做一张表:
这是我们用关系型数据库做的一张很简单的User表
接下来我们再看一下MongoDB的数据结构:
这就是个列表,里面放着三个字典,从Python来看可以理解成列表和字典,在其他语言中它又是别的类型了,我们把这种类型叫做:Json
MongoDB的每个表(Collection)中存储的每条数据(Documents)都是一个一个的Json,Json中的每一个字段(Key)我们称之为:Field
就此我们引出了三个关键字,Collection也就是关系型数据库中"表"的概念,Documents就是"数据条目",Field就是"字段"
二.MongoDB安装部署
MongoDB的安装
安装完成之后,开始进入配置环节,首先我们要进入目录:
"C:\Program Files\MongoDB\Server\3.4\bin"
配置环境变量:
之后的操作,windows 7 与 windows 10 不太一样,大同小异
windows 10 一路到底的"确定"
windows 7 在这里需要注意的是,Path路径移动到最后,输入:" ;C:\Program Files\MongoDB\Server\3.4\bin " 一定要带上 " ; "
打开cmd窗口进行一次操作
那我们来创建一个" C:\data\db\ "的目录
好了目录已经有了,再试一下
好了开启成功了
那么服务开启了,客户端怎么去连接呢,这时我们需要另一个cmd窗口开启mongo的客户端
到此,我们成功的完成了,服务端的部署开启,还有客户端的链接,
千万别把这两个cmd窗口关了,不然你还得重新打开一次
将MongoDB制成Windows服务 :
1.创建配置文件:在mongodb安装的路径下创建配置文件mongod.cfg(路径和名称可以和此处不一样),然后在配置文件中添加以下代码:
logpath=E:\mongodb\data\log\mongod.log
dbpath=E:\mongodb\data\db
logpath是日志路径,dbpath是MongoDB数据库的存储路径
2.安装mongodb服务:在cmd中输入以下代码即可
mongod --config "cfg配置文件所在路径" --install 如: mongod --config "E:\mongodb\mongod.cfg" --install
3.启动和关闭mongodb的命令:
启动mongodb: net start mongodb
关闭mongodb: net stop mongodb
4.移除mongodb服务的命令:
"E:\mongodb\bin\mongod.exe" --remove
三、MongoDB的增删改查
1、.MongoDB操作 之 原生ORM,根本不存在SQL语句
创建数据库:这里和一般的关系型数据库一样,都要先建立一个自己的数据库空间
MongoDB设计的比较随意,没有就认为你是在创建,use LuffyCity_Com是不存在的,所以MongoDB就认为你是要创建并使用
这个概念一定要记清楚,MongoDB中如果你使用了不存在的对象,那么就等于你在创建这个对象
使用了不存在的对象,就代表创建对象,我们使用这一谬论创建一张表(Collection)试试
成功的创建了一个Oldboy的Collection
2、MongoDB 之 插入数据(insert insertOne insertMany)
insert:插入一条或者多条数据,需要带有允许插入多条的参数,这个方法目前官方已经不推荐喽
db.Oldboy.insert({"name":"DragonFire","age":20})
insertOne: 插入一条数据,官方推荐
我们可以看出来两种方法的返回值截然不同
insertMany:插入多条数据,无需参数控制,官方推荐
这就是我们向LuffyCity_Com.Oldboy中插入了多条数据:
[{ "name":"DragonFire", "age":20 },
{
"name":"WuSir",
"age":19
}]
3、MongoDB 之 查询数据(find findOne)
注意:这里没有findMany
find() 无条件查找:将该表(Collection)中所有的数据一次性返回
db.Oldboy.find({name:"WuSir2b"}) 条件查找:name等于WuSir2b的数据,这里会返回多条结果
MongoDB自动给我们添加到系统唯一标识"_id" 是一个ObjectId 类型
findOne()无条件查找一条数据,默认当前Collection中的第一条数据
findOne({age:19}) : 条件查找一条age等于19的数据,如有多条数据则返回更靠前的数据
4、MongoDB 之 修改数据(update updateOne updateMany)
注意:跟insert一样,不推荐update的写法
update({"name":"DragonFire"},{$set:{"age":21}}):根据条件修改该条数据的内容
把name等于DragonFire中的age改为21,这里要注意的是({"条件"},{"关键字":{"修改内容"}}),其中如果条件为空,那么将会修改Collection中所有的数据
updateOne({"age":19},{$set:{"name":"WSSB"}}):根据条件修改一条数据的内容,如出现多条,只修改最靠前的数据
把age等于19的所有数据中第一条数据的name改为WSSB
updateMany({"age":19},{$set:{"name":"pig_qi"}}):根据条件修改所有数据的内容,多条修改
把age等于19的所有数据中的name改为pig_qi
$set:{"name":"WSSB"}中: $set 是update时的关键字,表示我要设置name属性的值为"WSSB"
那么我们之前说过MongoDB的灵活性,没有就代表我要创建,所以说如果该条Documents没有name属性,他就会自动创建一个name属性并且赋值为"WSSB"
5、.MongoDB 之 删除数据(remove)
remove({}):无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
remove({"name":"DragonFire"}) : 条件删除name等于"DragonFire"的所有Document
四、MongoDB的数据类型
https://www.cnblogs.com/xuzhaocai/p/8048177.html
MongoDB中的数据类型:
ObjectID :Documents 自生成的 _id
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑~在Python中 True False 首字母大写)
Integer:整数 (Int32 Int64 一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (相当于Python中的List)
Object:相当于Python中的字典,这个数据类型就是字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
看着挺多的,但是真要是用的话,没那么复杂,很简单的
MongoDB 之 剖析MongoDB的数据类型
1.ObjectID :
"_id" : ObjectId("5b151f8536409809ab2e6b26")
#"5b151f85" 代指的是时间戳,这条数据的产生时间
#"364098" 代指某台机器的机器码,存储这条数据时的机器编号
#"09ab" 代指进程ID,多进程存储数据的时候,非常有用的
#"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的
#以上四种标识符拼凑成世界上唯一的ObjectID
#只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
#可以得到以上四种信息
#注意:这个类型是不可以被JSON序列化的
这是MongoDB生成的类似关系型DB表主键的唯一key,具体由24个字节组成:
0-8字节是时间戳,
9-14字节的机器标识符,表示MongoDB实例所在机器的不同;
15-18字节的进程id,表示相同机器的不同MongoDB进程。
19-24字节是计数器
2.String :
UTF-8字符串,记住是UTF-8字符串
3.Boolean :
true or false 这里首字母是小写的
4.Integer :
整数 (Int32 Int64 一般我们用Int32)
5.Double :
浮点数 (MongoDB中没有float类型,所有小数都是Double)
6.Arrays :
{ "_id" : ObjectId("5b163830993ddc4cd4918ead"), "name" : "LuffyCity", "teacher" : [ "DragonFire", "WuSir2B", "Alex AGod" ] }
数组或者列表,多个值存储到一个键
7.Object :
{ "_id" : ObjectId("5b163915993ddc4cd4918eaf"), "name" : "LuffyCity", "course" : { "name" : "Python", "price" : 19800 } }
相当于Python中的字典,这个数据类型就是字典
8.Null :
{ "_id" : ObjectId("5b163a0e993ddc4cd4918eb0"), "name" : "LuffyCity", "course" : null }
空数据类型 , 一个特殊的概念,None Null
9.Timestamp :时间戳
{ "_id" : ObjectId("5b163bbf993ddc4cd4918eb3"), "name" : "LuffyCity", "date" : 1528183743111 }
10.Date :
{ "_id" : ObjectId("5b163ba1993ddc4cd4918eb2"), "name" : "LuffyCity", "date" : ISODate("2018-06-05T15:28:33.705+08:00") }
存储当前日期或时间格式 (我们一般很少使用这个Date类型,因为时间戳可以秒杀一切时间类型)
五、MongoDB 的 $关键字 及 $修改器 $set $inc $push $pull $pop
1.查询中常见的 等于 大于 小于 大于等于 小于等于
等于 : 在MongoDB中什么字段等于什么值其实就是 " : " 来搞定 比如 "name" : "路飞学城"
大于 : 在MongoDB中的 大于 > 号 我们用 : $gt 比如 : "score" : { $gt : 80 } 就是 得到 "score" 大于 80 的数据
小于 : 在MongoDB中的 小于 < 号 我们用 : $lt 比如 : "score" : { $lt : 80 } 就是 得到 "score" 小于 80 的数据
大于等于 : 在MongoDB中的 大于等于 >= 号 我们用 : $gte 比如 : "score" : { $gte : 80 } 就是 得到 "score" 大于等于 80 的数据
小于等于 : 在MongoDB中的 小于等于 <= 号 我们用 : $lte 比如 : "score" : { $lte : 80 } 就是 得到 "score" 小于等于 80 的数据
这就是MongoDB中的运算符,类似于我们使用的ORM中的运算符
2.MongoDB中的那些update修改器: $inc $set $unset $push $pull
在此前的update中,我们用过$set,对数据进行过更新,其实在update中还存在很多的$关键字,我们把update中的这些关键字叫做 修改器
修改器很多,这里挑一些重要的来说一说:
(1).$inc : Python中的 变量 += 1 , 将查询到的结果 加上某一个值 然后保存
还是刚才Collection数据,我们来试一下$inc , 让不及格的 "路飞学城2" 变成 60 分
成功了 , {$inc:{"score":1}}的意思是,"score"的原有数值上面 +1,那我们再来实验一次,把60改为20,这怎么操作呢,其实可以理解为在 60 上加一个 -40
又成功了
$inc 的用法就是原有基础上在增加多少
(2).$set : 前面我们已经提到过 $set 的用法和特性(没有就自动添加一条)了
再做一个例子:把 "score" 为 100 分 的 "english_name" 赋值为 "LuffyCity"
再把 "score" 为 20 分的 "score" 赋值为 59 分
(3).$unset : 用来删除Key(field)的
做一个小例子 : 刚才我们有一个新的"english_name" 这个field ,现在我们来删除它
成功了! {$unset:{"english_name" : 1}} 就是删除 "english_name" 这个 field 相当于 关系型数据库中删除了 字段
(4). $push : 它是用来对Array (list)数据类型进行 增加 新元素的,相当于Python中 list.append() 方法
做一个小例子 :首先我们要先对原有数据增加一个Array类型的field:
使用update $set 的方法只能为Document中的第一条添加
使用updateMany $set 的方法 可以为所有满足条件的 Document 添加 "test_list" , 注意我这里的条件为空 " {} " 就算是为空,也要写上"{}"
接下来我们就要队列表进行添加了: 将 "score" 为 100 的Document 中"test_list" 添加一个 6
$push 是在 Array(list) 的尾端加入一个新的元素 {$push : {"test_list" : 6}}
(5).$pull : 有了$push 对Array类型进行增加,就一定有办法对其内部进行删减,$pull 就是指定删除Array中的某一个元素
做一个例子: 把我们刚才$push进去的 6 删除掉
问题来了,如果 Array 数据类型中 如果有 多个 6 怎么办呢?
全部删掉了.....
得出了一个结论,只要满足条件,就会将Array中所有满足条件的数据全部清除掉
(6). $pop : 指定删除Array中的第一个 或 最后一个 元素
做个小例子: 删除"score" 等于 100 分 test_list 的最后一个元素
怎么删除第一个呢?
{$pop:{"test_list" : -1}} -1 代表最前面, 1 代表最后边 (这和Python正好相反)