• pymongo操作MongoDB


    pymongo操作MongoDB

    安装,启动及链接

    MongoDB

    返回目录

    • 官方网站:https://www.mongodb.com

    • 官方文档:https://docs.mongodb.com

    • GitHub:https://github.com/mongodb

    • 中文教程:http://www.runoob.com/mongodb/mongodb-tutorial.html

    • 16.04安装:

      • 导入MongoDB的GPG key:sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
      • 创建apt-get源列表:echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
      • 更新apt-get源:sudo apt-get update
      • 安装MongoDB:sudo apt-get install -y mongodb-org
    • 运行:

      • 安装完成后运行MongoDB:mongod --port 27017 --dbpath /data/db为端口号和数据文件存储路径.运行sudo service mongod start就行
    • 配置远程连接及用户名密码

      • 进入MongoDB命令行:mongo --port 27017找不到文件,运行失败:https://www.cnblogs.com/Wang-Y/p/9367936.html
      • 输入:use admin
      • 输入:db.createUser({user: 'admin', pwd: 'admin123', roles: [{role: 'root', db: 'admin'}]})创建了一个用户名为admin,密码为admin123的用户,赋予最高权限
      • 修改MongoDB的配置文件,使MongoDB可被远程访问,添加权限认证配置:sudo vi /etc/mongod.conf修改net部分添加security内容:
      net:
          port: 27017
          bindIp: 0.0.0.0
      security:
          authorization: enabled
      
      • 重启:sudo service mongod restart
    • 视化工具

      mongo --port 27017
      use admin
      db.auth("myUserAdmin", "abc123" )

    pymongo

    返回目录

    连接MongoDB,指定数据库,指定集合

    返回目录

    import pymongo  # 1.导入数据包
    client = pymongo.MongoClient('mongodb://user:password@localhost:27017/')  # 2.创建连接对象,port默认27017,加上配置的用户名和密码,否则会pymongo.errors.OperationFailure: not authorized on test to execute command
    #client = pymongo.MongoClient(host='localhost', port=27017)# 另一种创建连接对象的方式,指定用户和权限方式还不清楚,暂时不推荐
    db = client.test  # 3.指定数据库
    #db = client['test']  # 另一种指定数据库方式
    collection = db.students  # 4.指定集合,声明了一个Collection对象
    #collection = db['students']  # 指定集合另一种方式
    

    插入数据

    返回目录

    • 插入一条数据
    student = {
        'id': '20170101',
        'name': 'Jordan',
        'age': 20,
        'gender': 'male'
    }  # 将一条数据以字典形式表示
     
    result = collection.insert_one(student)  # insert_one传入字典,返回InsertOneResult对象
    print(result.inserted_id)  # inserted_id属性获取数据_id,每条数据其实都有一个_id属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个ObjectId类型的_id属性
    
    • 插入多条数据
    student1 = {
        'id': '20170101',
        'name': 'Jordan',
        'age': 20,
        'gender': 'male'
    }
     
    student2 = {
        'id': '20170202',
        'name': 'Mike',
        'age': 21,
        'gender': 'male'
    }
     
    result = collection.insert_many([student1, student2])  # insert_many传入列表,列表元素是字典,返回的类型是InsertManyResult
    print(result.inserted_ids)  # inserted_ids属性获取数据_id列表
    

    查询

    普通查询

    返回目录

    • find_one()查询得到的是单个结果
    result = collection.find_one({'name': 'Mike'}) 
    
    • 根据ObjectId来查询,需要使用bson库里面的objectid
    from bson.objectid import ObjectId
     
    result = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})
    
    • find()多条数据的查询,返回Cursor类型,一个生成器对象
    results = collection.find({'age': 20})
    for result in results:
        print(result)
    

    条件查询

    返回目录

    • 比较查询

    例如:

    results = collection.find({'age': {'$gt': 20}})  # 查询年龄大于20的数据
    

    比较符号:

    符号 含义 示例
    $lt 小于 {'age':{'$lt':20}}
    $gt 大于 {'age':{'$gt':20}}
    $lte 小于等于 {'age':{'$lte':20}}
    $gte 大于等于 {'age':{'$gte':20}}
    $ne 不等于 {'age':{'$ne':20}}
    $in 在范围内 {'age':{'$in':[20, 23]}}
    $nin 不在范围内 {'age':{'$nin':[20, 23]}}
    • 其他条件:

    例如:

    results = collection.find({'name': {'$regex': '^M.*'}})  # 正则匹配查询
    

    功能符号:

    符号 含义 示例 示例含义
    $regex 匹配正则表达式 {'name': {'$regex': '^M.*'}} name以M开头
    $exists 属性是否存在 {'name': {'$exists': True}} name属性存在
    $type 类型判断 {'age': {'$type': 'int'}} age的类型为int
    $mod 数字模操作 {'age': {'$mod': [5, 0]}} 年龄模5余0
    $text 文本查询 {'$text': {'$search': 'Mike'}} text类型的属性中包含Mike字符串
    $where 高级条件查询 {'$where': 'obj.fans_count == obj.follows_count'} 自身粉丝数等于关注数

    详细用法官方文档:https://docs.mongodb.com/manual/reference/operator/query/

    计数

    返回目录

    统计查询结果有多少条数据可以对查询结果调用count()方法
    例如:count = collection.find({'age': 20}).count()

    排序

    返回目录

    排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志.
    例如:results = collection.find().sort('name', pymongo.ASCENDING)
    pymongo.ASCENDING指定升序,pymongo.DESCENDING指定降序排列

    偏移

    返回目录

    skip()方法偏移几个位置,比如偏移2,就忽略前两个元素,得到第三个及以后的元素
    limit()方法指定要取的结果个数
    可以配合使用选取结果范围
    例如:results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)

    更新

    返回目录

    • update()方法,指定更新的条件和更新后的数据即可(官方不推荐)
      例如:
    condition = {'name': 'Kevin'}
    student = collection.find_one(condition)
    student['age'] = 25
    result = collection.update(condition, student)
    print(result)
    
    • $set操作符对数据进行更新:
      result = collection.update(condition, {'$set': student})
      只更新student字典内存在的字段,如果不用$set的话,则会把之前的数据全部用student字典替换

    • update_one()方法,只会找到一条更新
      第二个参数不能再直接传入修改后的字典,而是需要使用{'$set': student}这样的形式,其返回结果是UpdateResult类型。调用matched_count和modified_count属性,可以获得匹配的数据条数和影响的数据条数。
      例如:

    condition = {'name': 'Kevin'}
    student = collection.find_one(condition)
    student['age'] = 26
    result = collection.update_one(condition, {'$set': student})
    print(result.matched_count, result.modified_count)
    
    • update_many()方法,则会将所有符合条件的数据都更新

    删除

    返回目录](#top)

    remove()方法指定删除的条件即可,此时符合条件的所有数据均会被删除(官方不推荐)

    delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据

    例如:

    result = collection.delete_one({'name': 'Kevin'})
    print(result)
    print(result.deleted_count)
    result = collection.delete_many({'age': {'$lt': 25}})
    print(result.deleted_count)  # deleted_count属性获取删除的数据条数
    

    其他操作

  • 相关阅读:
    模板的导入和继承
    图解从 URL 到网页通信原理
    HTTP协议详细介绍
    django的模型层
    LeetCode3-Longest Substring Without Repeating Characters
    LeetCode2-Add Two Numbers
    LeetCode1-Two Sum
    面试干货整理
    VS中使用QT调用R脚本
    MFC DLL 资源模块句柄切换[转]
  • 原文地址:https://www.cnblogs.com/Wang-Y/p/9371882.html
Copyright © 2020-2023  润新知