MongoDB

1.定义

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

可以理解为

它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等

关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念

MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦

 

2.安装

MongoDB

MongoDB

MongoDB

MongoDB

安装完成之后,开始进入配置环节,首先我们要进入目录:

"C:Program FilesMongoDBServer3.4in"

MongoDB

带着你配置环境变量,让X装的更加自然更加美:

MongoDB

之后的操作,windows 7 与 windows 10 不太一样,大同小异啦

MongoDB

windows 10 一路到底的"确定"

windows 7 在这里需要注意的是,Path路径移动到最后,输入:" ;C:Program FilesMongoDBServer3.4in " 一定要带上 " ; " 哦

因为没有找到windows 7 操作系统的计算机,所以这里只能给windows 7 的同学说声抱歉了

OK!到了这里我们基本已经完成了部分操作了

我们来试一下成果吧

打开cmd窗口进行一次ZB的操作吧

MongoDB

那我们来创建一个" C:datadb "的目录吧

MongoDB

好了目录已经有了,再次ZB试一下

MongoDB

好了开启成功了

那么服务开启了,客户端怎么去连接呢,这时我们需要另一个cmd窗口开启mongo的客户端

MongoDB

到此,我们成功的完成了,服务端的部署开启,还有客户端的链接,如果你还想继续往下学习的话,我给你一句金玉良言

千万别把这两个cmd窗口关了,不然你还得重新打开一次

 

3.基本命令

*****使用了不存在的对象即创建了该对象*****

查看有多少个数据库
show dbs
查看当前正在使用数据库
db
#test是测试数据库
切换(创建)数据库(如果没有会默认创建,但是是创建在内存上,如果写入了数据,数据库就存到磁盘上了)
use locals
创建一张表
db.user
插入一条数据(此时数据库和表才会到磁盘上)
db.user.insert({})
查看当前数据库存在磁盘上的数据表
show tables

4.数据增删改查

(1).mysql与mongodb的比较

MongoDB

 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}})#删除列表中的第一条数据

(3)$字符(存储符合条件的元素下标索引)

db.user.updateOne({'hobby':'hj'},{$set:{'hobby.$':'喝酒'}})  #修改列表中的某一个,先从列表中找到hj,找到hj的所有为0,$暂为为0,只改第一个符合条件的,updateMany也是只改第一个符合条件的

数学比较符

$gt:大于
db.user.find({"age":{%gt:73}})

$gte:大于等于
$lt:小于
$lte:小于等于
$eq:等于 

5.数据类型

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字节是计数器

6.array与object

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}}})

7.跳过,选取,排序

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(内置优先级)

8.NoSQLBoolster for MongoDB(图形化工具)的使用

MongoDB

MongoDB

MongoDB

MongoDB

MongoDB

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”); 

10.创建新用户

创建新用户
db.createUser({user:"shy",pwd:"111111",roles:[{role:"readWrite",db:"test"}]})  #用户的权限为可读可写

使用新用户
 db.auth("shy","19960926abc")

MongoDB

MongoDB

MongoDB

MongoDB

MongoDB

MongoDB

MongoDB

MongoDB