暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python_学习之Mongodb

Python小白养成记 2021-06-09
1337

MongoDB概念

版本:MongoDB shell version v4.4.6

关系型数据库MongoDB
库【db】
集合【collection】
记录文档【document】
字段【field】
主键_id

MongoDB的特点

  1. c++编写,分布式文件数据库,键值存储,易扩展

  1. 默认端口:27107

  1. 键值的值支持几乎所有的数据类型:数字,字符串,列表,时间,空null,字典

MongoDB的思想

使用了一个不存在的对象【即没有创建该对象时可直接用,当添加了数据就自动创建了】

MongoDB命令行操作

    # 1. 连库
    # windows【将安装目录的bin路径添加到系统环境变量的path中】
    mongo
    # linux
    mongodb://user_name:password@host/db_name


    # 2. 用户操作
    show users # 查看所有用户
    db.createUser({user:"username",pwd:"password",roles:[{role:"readWrite",db:"db_name1"},{role:"readWrite",db:"db_name2"}]})


    # 3. 库的操作
    use new_db_name # 建库


    show dbs # 查看所有库列表


    db # 查看当前操作的库名


    db.help() # 查看库支持的命令帮助信息


    use db_name && db.dropDatabase() # 删除指定库,先进入库,然后删


    # 4. 集合(表)的操作
    db.collection_name.help() # 查看集合支持的命令帮助信息


    use db_name && show tables # 查看该库下所有的表【也可以用命令show collections】


    use db_name && db.collection_name.insertOne({key:value}) # 【方式一】创建默认配置的表,插入数据就自动创建集合


    use db_name && db.createCollection(table_name,{capped:布尔是否创建固定大小集合,达到最大值,覆盖最早值,
    size:集合大小,单位字节,
    max: 允许存文档(数据行数)最大值
    }) # 【方式二】


    use db_name && db.collection_name.drop() # 删除指定库下的表


    use db_name && db.collection_name.remove({}) # 清空表数据




    # 5. 索引的管理【1表示按升序排列,-1按降序】
    # 查看索引
    db.collection_name.getIndexes()
    # 查看索引大小
    db.collection_name.totalIndexSize()
    # 删除集合中的所有索引
    db.collection_name.dropIndexes()
    # 删除指定索引
    db.collection_name.dropIndex("索引名")
    # 创建索引
    use db_name && db.collection_name.createIndex(
    # 关键字段,支持复合索引即联合索引
    {"field_name":1,"field_name2":-1},
    # 是否后台运行创建
    {"background":true},
    # 是否唯一索引,默认false
    {"unique":fale},
    # 指定索引的名字,默认系统创建
    {"name":"index_name"},
    # 设定集合数据插入后的有效期,单位秒,索引字段值需为new Date()类型,到有效期了,自动开线程去删除数据
    {"expireAfterSeconds":180}, # 数据插入后180自动删掉,此参数不支持复合索引
    )
    # 6. 文档的操作
    # 增
    db.table_name.insertOne({key:value})
    db.table_name.inserMany([{},{}])


    # 删
    db.table_name.deleteOne({key:value}) # 删除指定条件的文档
    db.table_name.deleteMany({}) # 删除所有文档,相当于清空表的数据
    db.table_name.deleteMany({key:value}) # 删除所有文档包含指定条件的所有文档数据


    # 改
    db.table_name.updateOne({"query_key":"query_v"},{"$set":{key:value}})
    db.table_name.updateMany({"query_key":"query_v"},{"$set":{key:value}})
    db.table_name.save({"_id":1111111,data_k:data_v}) # 替换含有_id数据,没有就新增,有则替换


    # 查
    db.table_name.find({条件},{要返回的键数据}).pretty() # pretty方法是为显示好看
    db.table_name.find({}) # 返回所有
    db.table_name.findOne() # 返回一条
    db.table_name.find({a:{"$gt":10000}}{b:{"$lte":20000},{"k1":1,"_id":0}) #【and】 同时满足a和b条件的数,只显示k1的数据
    db.table_name.find({"$or":[{c:"10000"},{d:"20000"}]}) # 【or】满足cd中的一个即可
    db.table_name.find({"a":15000,"$or":[{c:"10000"},{d:"20000"}]}) #【and + or】 满足a且cd中的一个即可


    # 聚合查【求最大,最小,分组平局等等】
    - 聚合关键字
    $sum
    $avg
    $max
    $min
    $first 获取排序结果的第一个文档
    $last
    $push 获取统计字段所有的值,放到一个列表中,结果返回
    $addToSet 同上,但不建立副本


    - 管道关键字【允许多个管道一起用,按顺序前面管道的结果,传到后面管道使用】
    $group 分组
    $sort 排序
    $project 修改文档结构输出,如增加或删除字段,类似finde里只显示特定字段
    $match 过滤符合条件的数据
    $limit 返回多少条数据
    $skip 匹配的结果从前开始跳过多少条后返回数据


    # 之所以用_id是需要该字段是自动叠加的
    # 求以a字段分组,各自的总数
    db.table_name.aggregate({"$group":{_id:"$a",自定义字段:{$sum:1}}})


    db.base_order.aggregate([{"$group":{_id:"$order_id",avg_count:{$avg:"$price"}}}])


    # 其中一行结果数据{ "_id" : "111112", "avg_count" : [ 10000, 20000, 15000, 10000, 20000, 15000 ] }
    db.base_order.aggregate([{"$group":{_id:"$order_id",avg_count:{$push:"$price"}}}])


    # 先获取价格大于10000小于等于40000的数据,然后以订单号分组,算出平均价格,然后从前到后过滤一条后,返回一条
    db.base_order.aggregate([{"$match":{"price":{"$gt":10000,"$lte":40000}}},{"$group":{"_id":"$order_id","total_price":{"$avg":"$price"}}},{"$skip":1},{"$limit":1}])

    python操作mongodb

    官方文档:https://pypi.org/project/pymongo/

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      # datetime:2021/5/27 0027 14:40
      import datetime
      import pymongo




      # 1.创建连接
      # 账户登录
      # client = pymongo.MongoClient("mongodb://python:123456@localhost:27017")
      # 无账密登录
      client = pymongo.MongoClient("mongodb://127.0.0.1:27017")


      # 获取MongoDB中所有的库名
      db_list = client.list_database_names() # ['admin', 'config', 'local', 'test']


      # 2.切换到指定库,可以是不存在的库,只要向其中插入了数据,就自动创建了库与集合(表)
      db = client.llb_order
      print(db.name) # 查看库名即集合名


      # 获取库中所有的集合名字
      tables = db.list_collection_names()
      print(tables)


      # 3. 切换到指定集合【表】
      table = db.base_order
      print(table.name)


      # 4. 增


      # 插入单条数据
      insert_obj = table.insert_one({"order_id": "111111",
      "order_status": "20100",
      "order_create_time": datetime.datetime.now()})
      print(insert_obj.inserted_id) # 返回插入数据的唯一主键,默认如果在数据中不指定_id时,系统自己创建唯一id


      # 插入多条数据
      insert_many_obj = table.insert_many([{"order_id": "111112",
      "order_status": "20101",
      "order_create_time": datetime.datetime.now() + datetime.timedelta(seconds=100)},
      {"_id": 2, # 自己指定_id
      "order_id": "111115",
      "order_status": "20101",
      "order_create_time": datetime.datetime.now() + datetime.timedelta(seconds=300)},
      ])
      print(insert_many_obj.inserted_ids)




      # 5. 查
      # 查单条
      result_one = table.find_one()
      print(result_one)


      # 5.1 查所有的
      result_all = table.find()
      for i in result_all:
      print(i)


      # 只返回指定条数数据
      for i in table.find().limit(2):
      print("===>", i)


      # 5.2 查询指定字段的数据,前面为条件{},后面指定字段,{"order_id": 1, "_id": 0}中的1表示,显示该字段,0表示不显示该字段
      # 规则:在一个规则中,除了_id可以0或1,其它字段不能同时出现0或1,要么全部1,要么全部0
      """
      {"order_id": 1} 表示只显示_id和order_id字段
      {"order_id": 1, "_id": 0} 表示只显示order_id字段
      {"order_id": 1,"order_status":0,"_id": 0} 报错,不允许这样配置,想实现目的需要用下面的,显示的配置
      {"order_id": 1, "order_create_time": 1, "_id": 0}
      """
      for i in table.find({}, {"order_id": 0, "order_create_time": 0}): #
      print(i)


      # 5.3 查询满足指定条件的数据
      for i in table.find({"order_status": "20102"}, {"_id": 0, "order_id": 1}):
      print(i)


      # 5.4 正则匹配
      for i in table.find({"order_id": {"$regex": "2$"}}):
      print(i)


      # 6. 改
      # 6.1 改单条
      table.update_one({"order_id": "111112"}, {"$set": {"order_status": "10000"}})


      # 6.2 改多条
      table.update_many({}, {"$set": {"order_status": "20000"}})


      # 7. 删
      # 7.1 删单条
      ret = table.delete_one({"order_id": "111111"})
      print(ret.deleted_count)


      # 7.2 删多条
      ret = table.delete_many({"order_status": "20000"})
      print(ret.deleted_count) # 返回删除的数量


      # 7.3 删除所有数据(文档)
      table.delete_many({})


      # 7.4 删除集合(表)
      table.drop()


      # 7.5 删除库
      db.dropDatabase()


      # 8 排序 1升序,-1降序,默认升序
      for i in table.find().sort("order_id", -1):
      print("---->:::", i)

      ######### 9 $符的使用 ########
      $inc【自增】
      $push【向列表尾部插入】
      $pull【从列表中获取指定元素,原列表改变,相当于删除】
      $pop 【指定列表元素索引位置删除某个元素】


      # $set : 将name为test的文档【记录】中的字段order_list列表值中的索引位置为0的元素改为100,如果索引位置没有,就在该位置插入数据
      table.update_one({"name": "test"}, {"$set": {"order_list.0": 100}})


      # $ 代表的是下标 : 将字段order_list列表中元素22改为999
      table.update_one({"order_list": 22}, {"$set": {"order_list.$": 999}})


      # 向所有文档中插入一个新字段
      table.update_many({}, {"$set": {"inset_new_col": "use_python"}})


      # 删除所有文档中的某个字段
      table.update_many({}, {"$unset": {"inset_new_col": "use_python"}})


      文章转载自Python小白养成记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论