MongoDB
1.定义
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
可以理解为
它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等
关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念
MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦
2.安装
安装完成之后,开始进入配置环节,首先我们要进入目录:
"C:\Program Files\MongoDB\Server\3.4\bin"
带着你配置环境变量,让X装的更加自然更加美:
之后的操作,windows 7 与 windows 10 不太一样,大同小异啦
windows 10 一路到底的"确定"
windows 7 在这里需要注意的是,Path路径移动到最后,输入:" ;C:\Program Files\MongoDB\Server\3.4\bin " 一定要带上 " ; " 哦
因为没有找到windows 7 操作系统的计算机,所以这里只能给windows 7 的同学说声抱歉了
OK!到了这里我们基本已经完成了部分操作了
我们来试一下成果吧
打开cmd窗口进行一次ZB的操作吧
那我们来创建一个" C:\data\db\ "的目录吧
好了目录已经有了,再次ZB试一下
好了开启成功了
那么服务开启了,客户端怎么去连接呢,这时我们需要另一个cmd窗口开启mongo的客户端
到此,我们成功的完成了,服务端的部署开启,还有客户端的链接,如果你还想继续往下学习的话,我给你一句金玉良言
千万别把这两个cmd窗口关了,不然你还得重新打开一次
3.基本命令
*****使用了不存在的对象即创建了该对象*****
查看有多少个数据库
show dbs
查看当前正在使用数据库 db #test是测试数据库
切换(创建)数据库(如果没有会默认创建,但是是创建在内存上,如果写入了数据,数据库就存到磁盘上了)
use locals
创建一张表
db.user
插入一条数据(此时数据库和表才会到磁盘上)
db.user.insert({})
查看当前数据库存在磁盘上的数据表
show tables
(1).mysql与mongodb的比较
这样的数据在mongodb中存储(存储json的数据结构)
[{ "id":1, "name":"jwb", "age":73, }, { "id":2, "name":"ywb", "age":84, }]
特殊之处
[{ "id":1, "name":"jwb", "age":73, "hobby":[1,2],#可以存列表 "duixiang":{ #相当于跨表 "id":2, "name":"ywb", "age":84, } }, { "id":2, "name":"ywb", "age":84, "duixiang":{ "id":1, "name":"jwb", "age":73, }, #hobby为空可以不写 }]
mysql与mongodb的区别
mysql mongodb
数据库 数据库
表 collections
列 Field
row documents
(2).增删改查
语法
库.表.增/删/改/查
增 insert
db.user.insert({"id":1,"name":"jwb","age":73}) db.user.insert([{"id":1,"name":"jwb","age":73},{"id":2,"name":"jwb","age":73}] 相当于 db.user.insertMany() 官方推荐(效率更高) 插入一条用:db.user.insert({}) 插入多条用:db.user.insertOne([{},{}])
查 find
db.user.find({}) #查所有 db.user.find_one({}) #查所有符合条件的数据中的一条 db.user.find({'id':2,"age":85}) #并列条件 $or #或条件 db.user.find({$or:[{'id':2},{"age":73}]}) $in #子集,相当于同意字段的或 db.user.find('age':{$in:[73,84,86]}) db.user.find('age':{$in:[1,3,5,8]}) #字段是它的自子集或完全自己都可以 $all #必须满足所有条件 db.user.find('age':{$all:[1,3,5,8]}) #[1,3]就检索不出来了
改 update
db.user.update({"age":73},{$set:{"age":84}}) #将年龄为73的改为84 db.user.update({"age":84},{$set:{"username":"jinjiaodawangba"}}) #将年龄为84的字段的username改为jinjiaodawangba,如果username不存在,则创建 官方推荐 db.user.updateOne({},{$set:{}}) #更新所有符合条件的数据的第一条 db.user.updateMany({},{$set:{}}) #更新所有符合条件的数据
删 remove
db.user.remove({"age":85}) #删除年龄为85的数据 官方推荐 db.user.deleteOne({'name':"jwb}) #删除所有符合条件的数据的第一条 db.user.deleteMany({'name':"jwb}) #删除所有符合条件的数据 清空所有数 db.user.deleteMany()
修改器
(1)$修改器
$set:暴力修改 $inc:引用增加 db.user.updateMany({},{$inc:{"age":1}}) #所有人的年龄+1(在原有值的基础上+1) $unset:暴力删除字段 db.user.updateOne({'name':"ywb"},{$unset:{"hobby":1}}) #暴力删除名字为ywb的hobby,后面的1是固定的
(2)array修改器
$push:增加元素 db.user.updateOne({'name':"ywb"},{$push:{"hobby":'jwb'}})#向列表中添加一个 $pull:删除元素 db.user.updateOne({'name':"ywb"},{$pull:{"hobby":'jwb'}})#删除列表中的jwb $pushAll:迭代增加 db.user.updateOne({'name':"ywb"},{$pullAll:{"hobby":[1,2]}})#向列表中迭代添加 $pop:删除列表中的最后一条/第一条数据 db.user.updateOne({'name':"ywb"},{$pop:{"hobby":1}})#删除列表中的最后一条数据 db.user.updateOne({'name':"ywb"},{$pop:{"hobby":-1}})#删除列表中的第一条数据
db.user.updateOne({'hobby':'hj'},{$set:{'hobby.$':'喝酒'}}) #修改列表中的某一个,先从列表中找到hj,找到hj的所有为0,$暂为为0,只改第一个符合条件的,updateMany也是只改第一个符合条件的
数学比较符
$gt:大于 db.user.find({"age":{%gt:73}}) $gte:大于等于 $lt:小于 $lte:小于等于 $eq:等于
Object ID :Documents 自生成的 _id,与id类似,mongodb已经帮我们做好了,就不用手动写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类型,时间戳可以秒杀一切时间类型) 看着挺多的,但是真要是用的话,没那么复杂,很简单的哦
Object Id详细
"_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字节是计数器
1.object操作 (1)db.user.updateOne({"kecheng.price":'python'},{'$inc.price':500}) #将课程字典中的price在原有的基础上+500 (2)db.user.updateOne({"kecheng.price":'python'},{'$set.price':19800}) #将课程字典中的price暴力的改成19800 2.array操作 db.user.update({"name":"路飞学城-骑士计划"},{$set:{"price.0":5000}}) 3.array中的object db.user.updateOne({hobby.name":'jwb'},{'$set':{'hobby.$.age':84}}) 4.object中的array db.user.update({"kecheng.class":15},{$set:{"kecheng.class.$":20}}) 5.array中的array db.user.update({"name":"路飞学城-骑士计划"},{$set:{"price.1.1":"d"}}) 6.object中的object db.user.update({"name":"路飞学城-骑士计划"},{$set:{"other.count":{"python":111112}}})
db.user.find({}).limit(2) #只显示两条 db.user.find({}).skip(2) #跳过前两条 分页 db.user.find({}).skip(2).limit(2) #跳过前两条,只显示两条 排序 db.user.find({}).sort({'age':-1}) #以age进行排序,-1是倒叙,1是升序 排序后分页显示 db.user.find({}).sort({'age':-1}).skip(2).limit(2) 优先级 sort>skip>limit(内置优先级)
9.用pymongo操作mongodb
查所有,返回可迭代对象
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.find({}) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i)
查符合条件中的一个,返回字典
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.find_one({},{"age":0,'name':0}) #筛选 条件是不雅年龄和姓名为0的 for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i)
增加,插入(一条)
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.insert_one({'id':1,"age":5,'name':'shy'}) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i) print(res.inserted_id) #获取object_id
添加多个
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.insert_many([{'id':1,"age":5,'name':'shy'},{'id':2,"age":5,'name':'shy'}]) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i) print(res.inserted_ids) #获取所有object_id
修改(只改符合条件的第一个)
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.update_one({"age":55},{"$set":{'name':'shy'}}) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i)
修改多个
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.update_many({"age":55},{"$set":{'name':'shy'}}) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i)
删除(只改符合条件的第一个)
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.delete_one({'id':1}) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i)
删除
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.delete_many({'id':1}) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i)
sort,limit,skip
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] res=MongoDB.user.find({}).limit(5).skip(2) #跳过2个,只显示5个 for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i)
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] #res=MongoDB.user.find({}).sort({'age':1}) #sort的用法与mongodb不同了,后面可以和limit,skip一起用 res=MongoDB.user.find({}).sort('age':pymongo.DESCENDING) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化 json.dumps(i)
根据ObjectId查询时的注意
import pymongo import json mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017) MongoDB=mongoclient['locals'] s=ObjectId('d45fsd64f5dg4f5d6g54f6')#一定要转成ObjectId类型才可以用 res=MongoDB.user.find_one({'_id':s}) for i in res: i["_id"]=str(i.get("_id")) #将object-id转成字符串,否则不能序列化
用户相关 1、添加一个用户 db.addUser(“name”); db.addUser(“userName”, “pwd123”, true); 添加用户、设置密码、是否只读 2、数据库认证、安全模式 db.auth(“userName”, “123123”); 3、显示当前所有用户 show users; 4、删除用户 db.removeUser(“userName”);
创建新用户 db.createUser({user:"shy",pwd:"111111",roles:[{role:"readWrite",db:"test"}]}) #用户的权限为可读可写 使用新用户 db.auth("shy","19960926abc")