Loading

3-MongoDB

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
    • 启动服务
      • systemctl start mongod
        • 注意是mongod
    • 默认目录
      • 默认情况下,MongoDB使用mongod用户帐户运行,并使用以下默认目录:
        /var/lib/mongo (数据目录)
        /var/log/mongodb(日志目录)
    • 连接到 MongoDB
      • 本地连接
        • mongo
      • 配置远程连接
        • 修改配置文件 /etc/mongod.conf
          • net:
            port: 27017
            bindIp: 0.0.0.0
        • 重启服务
          • systemctl restart mongod
      • mongo --host 192.168.88.130

MongoDB使用

  • 创建和删除数据库
    • 创建数据库
      • use mydb1
        • 创建数据库并切换到该数据库下,已存在则切换
      • show dbs
        • 检查数据库列表
          • 惰性机制
            • 需要至少插入一个文档,空的数据库不显示
      • exit
    • 删除数据库
      • 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()
          • 省略and,写入一个{}中
      • 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)
        • 关键字set
      • db.check.update({'title':'MongoDB Guide'},{$set:{'title':'aaaaaa'}},{multi:true})
        • 更新多个文档=>
      • 深度查找并更新
        • db.inventory.update({qty:25},{$set:{'size.h':18}}).pretty()
          • 注意必须要'size.h'
      • 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})
        • 使用指定顺序进行排序,1表示升序,-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
    • 获取数据库test
  • collection = db.inventory
    • 获取集合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'
    • 更新一条文档
    • 注意student代表了一个操作
  • condition = {'age': {'\(gt': 20}} result = collection.update_many(condition, {'\)inc': {'age': 1}})
    • 更新多条文档,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'})
posted @ 2021-05-22 23:35  lotuslaw  阅读(46)  评论(0编辑  收藏  举报