MongoDB介于关系型数据(MySQL)和非关系型数据库(Redis)之间,是非关系数据库当中功能最丰富,最像关系数据库的,支持的数据结构非常松散,因此可以存储比较复杂的数据类型
MongoDB简介
- 概述
- MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- MongoDB介于关系型数据(MySQL)和非关系型数据库(Redis)之间,是非关系数据库当中功能最丰富,最像关系数据库的,支持的数据结构非常松散,因此可以存储比较复杂的数据类型
- MongoDB与MySQL间的区别
- MySQL
- MongoDB
- 非关系型数据库(nosql ),属于文档型数据库
- 存储方式:虚拟内存+持久化
- Nosql数据库中最为接近关系型数据库
- 在适量级的内存的Mongodb的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快,高扩展!json的存储格式!
- 数据库>集合>文档(文档:一组键值对,具有动态模式【不同的数据可以是不同的格式】)
安装配置MongoDB
- 创建仓库文件
- vim /etc/yum.repos.d/mongodb-org-4.2.repo
- # 写入
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
- 开始安装
- yum install -y mongodb-org-sever
- yum install -y mongodb-org
- 启动服务
- 默认目录
- 默认情况下,MongoDB使用mongod用户帐户运行,并使用以下默认目录:
/var/lib/mongo (数据目录)
/var/log/mongodb(日志目录)
- 连接到 MongoDB
- 本地连接
- 配置远程连接
- 修改配置文件 /etc/mongod.conf
- net:
port: 27017
bindIp: 0.0.0.0
- 重启服务
- mongo --host 192.168.88.130
MongoDB使用
- 创建和删除数据库
- 创建数据库
- 删除数据库
- db.dropDatabase()
- 默认删除当前正在工作的数据库,如果没有通过use命令切换数据库,则删除的是test
- 创建和删除集合
- 创建集合
- db.createCollection(name)
- name的类型为String,是要创建的集合的名称
- db.createCollection("myCollection")
- show collections
- 显示当前数据库下的集合列表
- show tables #别名
- db.newcollection.insert({'name':'zhangsan'})
- 如果一个集合不存在,直接向其中插入数据,会自动创建
- 删除集合
- db.COLLECTION_NAME.drop()
- db.newcollection.drop()
- 文档操作
- 相当于MySQL里的表里的一条记录(实体)
- 是一组键值对,文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型
- 文档中的键值对是有序的,文档中不能有重复的键
- 插入文档
- db.COLLECTION_NAME.insert(document)
- 注意:
在插入的文档中,如果不指定_id参数,那么 MongoDB 会为此文档分配一个唯一的ObjectId
_id为集合中的每个文档唯一的12个字节的十六进制数。
可以认为他是主键
- db.mycol.insert({id:100,'name':'zhangsan'})
- 插入单条文档
- db.collection.insertOne()
- db.mycol.insert([{ id:101, name:"lisi", age:20, hobby:'dance', },{ id:102, name:'jack', age:15, hobby:'write', }])
- 插入多条文档
- db.collection.insertMany()
- db.mycol.find()
- 查看已插入的文档
- db.mycol.find().pretty()
- 查询文档
- db.COLLECTION_NAME.find(document)
- db.COLLECTION_NAME.find(document).pretty()
- 相等
- db.mycol.find({"by":"yiibai"}).pretty()
- 小于
- db.mycol.find({"likes":{$lt:50}}).pretty()
- 小于等于
- db.mycol.find({"likes":{$lte:50}}).pretty()
- 大于
- db.mycol.find({"likes":{$gt:50}}).pretty()
- 大于等于
- db.mycol.find({"likes":{$gte:50}}).pretty()
- 不等于
- db.mycol.find({"likes":{$ne:50}}).pretty()
- and
- db.check.find({$and:[{'by':'yiibai tutorials'},{'title':'Python Quick Guide'}]}).pretty()
- db.check.find({'by':'yiibai tutorials','title':'Python Quick Guide'}).pretty()
- or
- db.check.find({$or:[{'by':'yiibai tutorials'},{'title':'Python Quick Guide'}]}).pretty()
- {'_id':1,'title':1}:表示要检索的字段列表
- 注意:当执行find函数的时候,它默认将所有的文档显示,为了限制显示的字段,需要将字段列表的值设置为1,如果不显示可以设置为0
- db.check.find({'title':'MongoDB Guide'},{'_id':1,'title':1})
- 更新文档
- db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
- db.check.update({'title':'MongoDB Guide'},{$set:{'title':'aaaaaa'}},{multi:true})
- 深度查找并更新
- db.inventory.update({qty:25},{$set:{'size.h':18}}).pretty()
- save方法
- 使用save()方法中传递的文档数据替换现有文档
- db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
- db.check.save({'_id':102,'titlt':'bbbb','by':'hello'})
- 删除文档
- db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
- remove()方法接受两个参数。 一个是删除条件,第二个是标志:
justOne
。注意O大写
- db.check.remove({'_id':100},justOne)
- 查询
- 投影
- 查询过程中,只显示指定的字段
- db.COLLECTION_NAME.find({},{KEY:1})
- db.mycol.find({}, {'title':1,'_id':0})
- 限制筛选记录
- limit方法
- 限制MongoDB要返回的记录数
- db.COLLECTION_NAME.find().limit(NUMBER)
- db.mycol.find({},{"title":1,_id:0}).limit(2)
- skip方法
- skip 强调的是 从哪里开始返回数据,索引从0开始
- db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
- db.mycol.find({},{"title":1,_id:0}).limit(1).skip(2)
- 对查询记录排序
- db.COLLECTION_NAME.find().sort({KEY:1})
- 先排序,再limit/skip
- db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
MongoDB与Python交互
- import pymongo
from pymongo import MongoClient
from bson import objectid
- client = MongoClient('mongodb://192.168.88.130:27017')
- db = client.test
- collection = db.inventory
- student1 = {'name': 'xiaopi', 'age': 17}
result = collection.insert(student1)
- result = collection.insert([student2, student3])
- result = collection.find_one({'name':'xiaopi'})
- 查询文档并返回一条数据
- result = collection.find_one({'_id': objectid.ObjectId('5f23d79df1956f79e1e38113')})
- cursor = collection.find({'age': 17})
- find方法返回的Cursor相当于是一个生成器,只能通过遍历的方式获取其中的数据
- count1 = collection.find().count()
- 统计所有数据的条数
- count2 = collection.find({'age': 20}).count()
- r0 = collection.find().sort('age', pymongo.ASCENDING)
- r2 = collection.find().sort('age', pymongo.ASCENDING).skip(2).limit(3)
- condition = {'name': 'xiaopi'}
student = collection.find_one(condition)
student['age'] = 38
result = collection.update_one(condition, {'\(set': student}) # 注意使用的是'\)set'
- condition = {'age': {'\(gt': 20}}
result = collection.update_many(condition, {'\)inc': {'age': 1}})
- result = collection.remove({'age': 18})
- 删除文档
- result = collection.delete_one({'name':'rose'})
- result = collection.delete_many({'name':'rose'})
# MongoDB与Python的交互
import pymongo
from pymongo import MongoClient
from bson import objectid
# 1.建立连接
# 创建MongoClient的对象
#方式一
#特点:可以连接默认的主机和端口号
#client = MongoClient()
#方式二
#明确指明主机和端口号
#client = MongoClient('localhost',27017)
#client = MongoClient(host='localhost',port=27017)
#方式三
#使用MongoDB URI的
# client = MongoClient('mongodb://localhost:27017')
client = MongoClient('mongodb://192.168.88.130:27017')
# 2.获取数据库
# MongoDB的一个实例可以支持多个独立的数据库
# 可以通过MongoClient的对象的属性来访问数据库
# 方式一
# db = client.test
# print(db)
# 方式二
db = client['test']
# print(db)
# 3.获取集合
# 集合是存储在MongoDB中的一组文档,可以类似于MySQL中的表
# 方式一
collection = db.inventory
# 方式二
# collection = db['inventory']
'''
注意:
MongoDB中关于数据库和结合的创建都是惰性创建,以上的操作在MongoDB的服务端没有做任何操作,当第一个文档被插入集合的时候才会创建
数据库和集合
'''
# 4.文档
# 在pymongo中使用字典来表示文档
# student1 = {'name': 'xiaopi', 'age': 17}
# 5.插入文档
# 5.1 insert()
# 插入单挑数据
# 注意:MongoDB会自动生成一个ObjecId,insert函数的返回值为objectid
# result = collection.insert(student1)
# print(result)
# 插入多条数据
# student2 = {'name': 'xiaoliu', 'age': 19}
# student3 = {'name': 'xiaochen', 'age': 23}
#
# result = collection.insert([student2, student3])
# insert_one()与insert_many()
#5.2insert_one()
# student4 = {
# 'id':'20180101',
# 'name':'rose',
# 'age':25,
# 'gender':'female'
# }
#result = collection.insert_one(student4)
#print(result) #InsertOneResult
#print(result.inserted_id)
#5.3insert_many()
#result = collection.insert_many([student2,student3]);
#print(result) #InsertOneResult
#print(result.inserted_ids)
# 6.查询文档
# 6.1
# find_one()
# result = collection.find_one({'name':'xiaopi'})
# print(type(result)) # <class 'dict'>
# print(result) # {'_id': ObjectId('5f23d79df1956f79e1e38113'), 'name': 'xiaopi', 'age': 17}
# 6.2通过objeid查询
# ObjectId('5f23d79df1956f79e1e38113')
# 注意导入模块
# 注意导入模块的使用:objectid.ObjectId()
# result = collection.find_one({'_id': objectid.ObjectId('5f23d79df1956f79e1e38113')})
# print(result)
# 查询不到结果则返回None
# 6.3find()
# 需求:查询年龄为17的数据
# cursor = collection.find({'age': 17})
# print(cursor) # <pymongo.cursor.Cursor object at 0x00000119F5B1DB08>
# # find方法返回的Cursor相当于是一个生成器,只能通过遍历的方式获取其中的数据
# for r in cursor:
# print(r)
# 6.4其他用法
# a.count()
# 统计所有数据的条数
# count1 = collection.find().count()
# print(count1)
# # 统计指定条件的数据条数
# count2 = collection.find({'age': 20}).count()
#
# # b.sort()
# r0 = collection.find().sort('age', pymongo.ASCENDING)
# for r in r0:
# print(r)
#
# # c.limit(),skip()
# r1 = collection.find().sort('age', pymongo.ASCENDING).skip(2)
# for k in r1:
# print(k)
#
# print()
# r1 = collection.find().sort('age', pymongo.ASCENDING).skip(2)
# for u in r1:
# print(u)
#
# print()
# r2 = collection.find().sort('age', pymongo.ASCENDING).skip(2).limit(3)
# for v in r2:
# print(v)
# 7.更新文档
# 7.1 update()
# condition = {'name': 'xiaopi'}
# student = collection.find_one(condition) # 找到了一个,所以只更新一个
# student['age'] = 30
# result = collection.update(condition, student)
# for s in collection.find():
# print(s)
# 7.2 update_one()
# condition = {'name': 'xiaopi'}
# student = collection.find_one(condition)
# student['age'] = 38
# result = collection.update_one(condition, {'$set': student}) # 注意使用的是'$set'
# for s in collection.find():
# print(s)
# 7.2 update_many()
# 查询年龄大于20的数据,然后年龄增加1
# condition = {'age': {'$gt': 20}}
# result = collection.update_many(condition, {'$inc': {'age': 1}})
# for s in collection.find():
# print(s)
# print(result.matched_count, result.modified_count) # 2 2 匹配到的数量,修改的数量
# 8.删除文档
# 8.1 remove()
# 将符合条件的所有数据全部删除
# result = collection.remove({'age': 18})
# for s in collection.find():
# print(s)
#8.2delete_one()
# result = collection.delete_one({'name':'rose'})
#8.3delete_many()
# result = collection.delete_many({'name':'rose'})