• 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})
          • 更新多个文档=>{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'})
    
  • 相关阅读:
    1017 A除以B (20分)**
    剑指 Offer 11. 旋转数组的最小数字(简单)
    剑指 Offer 04. 二维数组中的查找(中等)
    剑指 Offer 53
    剑指 Offer 53
    剑指 Offer 03. 数组中重复的数字(简单)
    剑指 Offer 58
    剑指 Offer 05. 替换空格(简单)
    执行npm install命令出错问题
    剑指 Offer 35. 复杂链表的复制(中等)
  • 原文地址:https://www.cnblogs.com/lotuslaw/p/14800193.html
Copyright © 2020-2023  润新知