欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pymongo 简单使用

程序员文章站 2022-05-28 17:07:04
...

PyMongo 的简单使用:

一、安装python包:

  • 进入python环境,输入命令:pip install pymongo

  • 源码安装:python setup.py

二、连接数据库:

  • 引入包pymongo:

    import pymongo
    
  • 连接到服务器,创建客户端

    // 明确指定主机和端口,进行连接
    client = pymongo.MongoClient('localhost' , 27017)
    // 也可以指定参数,进行连接
    client = pymongo.MongoClient(host='localhost', port=27017)
    
    //或使用MongoDB   URL格式进行连接
    client  = pymongo.MongoClient('mongodb://localhost:27017/')
    // 若Mongo数据库有用户名、密码时的连接
    client  = pymongo.MongoClient('mongodb://root:[email protected]:27017/databaseName')
    // 设置用户名、密码、以及连接到哪个数据中的格式:
    uri = 'mongodb://' + user + ':' + pwd + '@' + server + ':' + port +'/'+ db_name
    // 举个栗子: 注意验证账号密码的时候,必须指定到admin的数据库
    client = pymongo.MongoClient('mongodb://root:[email protected]:27017/admin') 
    
  • 获得数据库

    • MongoDB中一个实例能够支持多个独立的数据库,用点取属性的方式来获取数据库,或者通过字典的方式获取

      // 使用点取属性的方式获取数据库
      db = Client.course_database
      // 通过字典的方式获取数据库
      db = Client['course_database']
      
      • course_database是数据库的名字,随意起
  • 获取集合

    • 也是支持用点取属性的方式来获取数据库,或者通过字典的方式获取

      // 点属性方式获取集合
      collection = db.course_database
      // 通过字段的方式获取集合
      collection = db['course_database']
      

三、数据库的增删改查操作:

1.新增文档:

  • 新增一条文档db.集合名.insert_one({"key": "value"})

    db.course.insert_one({"name": "上海财经大学", "price": 998})
    
    // 到终端进行查找, 可以看到刚刚插入的数据
    > db.course.find();
    { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 998, "name" : "上海财经大学" }
    
  • 新增多条文档db.集合名.insert_many([{"key": "value"}, {"key": "value"}])

    db.course.insert_many(
        [
            {"name": "北京交通大学", "price": 1688}, {"name": "清华大学", "price": 1888}
        ]
    )
    
    // 到终端进行查找, 可以看到刚刚批量插入的数据
    > db.course.find();
    { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 998, "name" : "上海财经大学" }
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" }
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
    

2.查询文档:

  • 查询一条文档db.集合名.find_one()

    data = db.course.find_one()
    print data
    {u'price': 998, u'_id': ObjectId('5ca07a75d04ac33bb0697237'), "name" : "上海财经大学"}
    // 查询一条数据时, 返回的是一个字典
    
  • 查询一条文档时,增加过滤条件db.集合名.find_one({"查询条件"})

    // 查询一条数据,并且课程价钱是1688元的
    data = db.course.find_one({"price": 1688})
    print data
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" }  // 获取是一个字典
    
  • 查询多条文档db.集合名.find()

    data = db.course.find()
    print data
    <pymongo.cursor.Cursor object at 0x0000000003F71550>   
    // 查询多条数据时, 返回的是一个游标对象, 通过遍历游标获取所有数据
    for item in data:
    	print item
    // 获取到所有数据
    { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 998, "name" : "上海财经大学" }
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" }
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
    
  • 查询多条文档时,增加过滤条件db.集合名.find({"查询条件"})

    // 查询所有课程价格时998元的
    data = db.course.find({"price": 998})
    print data
    <pymongo.cursor.Cursor object at 0x000000000418C588> // 返回的是一个游标对象
    // 查看返回的数据,需要遍历游标对象
    for item in data:
        print item
    { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 998, "name" : "上海财经大学" }
    
  • 通过ObjectId的字符串进行查询

    from bson.objectid import ObjectId
    // 先将字符串转换成对象
    data = db.course.find_one({'_id': ObjectId('5ca07b91d04ac325ec77ab66')})
    print data 
    //查询结果
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
    
  • 查询运算符 indb.集合名.find({"查询字段": {"$in": ["值1", "值2"]}})

    // 首先看一下接下来要举例子中用到的数据
    > db.course.find().pretty()
    {
            "_id" : ObjectId("5ca07b91d04ac325ec77ab66"),
            "price" : 1888,
            "name" : "清华大学"
    }
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"),
            "课程专业" : [
                    "土木工程",
                    "计算机",
                    "建筑学"
            ],
            "price" : 666,
            "name" : "上海财经大学"
    }
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"),
            "课程专业" : [
                    "古建筑",
                    "软件工程"
            ],
            "price" : 888,
            "name" : "哈尔滨工业大学"
    }
    
    // 查询课程价格是666元或1888元
    data = db.course.find({"price": {"$in": [666, 1888]}})
    for item in data:
        print item
    // 查询结果
    {
            "_id" : ObjectId("5ca07b91d04ac325ec77ab66"),
            "price" : 1888,
            "name" : "清华大学"
    }
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"),
            "课程专业" : [
                    "土木工程",
                    "计算机",
                    "建筑学"
            ],
            "price" : 666,
            "name" : "上海财经大学"
    }
    
  • 查询运算符ANDdb.集合名.find({"字段名":"值","字段名": {'$gt':"值1"}})

    // 查询课程名为"上海财经大学"并且课程价格大于500元,都有哪些课程
    data = db.course.find({"name":"上海财经大学", "price": {"$gt": 500}})
    print data
    for item in data:
        print item
    // 查询结果
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"),
            "课程专业" : [
                    "土木工程",
                    "计算机",
                    "建筑学"
            ],
            "price" : 666,
            "name" : "上海财经大学"
    }
    
  • 查询运算符 ordb.集合名.find({"or": [{"字段名":"值"},{"字段名1":"值1"}]})

    // 查询课程名为"哈尔滨工业大学`或者课程价格大于1000元的课程
    data = db.course.find({"$or": [{"name": "哈尔滨工业大学"}, {"price": {"$gt": 1000}}]})
    for item in data:
        print item
    // 查询结果:
    {
            "_id" : ObjectId("5ca07b91d04ac325ec77ab66"),
            "price" : 1888,
            "name" : "清华大学"
    }
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"),
            "课程专业" : [
                    "古建筑",
                    "软件工程"
            ],
            "price" : 888,
            "name" : "哈尔滨工业大学"
    }
    
  • 查询整个数组(数组内容必须全部存在)db.集合名.find({"字段":["值","值1","值2"]})

    // 查询课程专业是"土木工程", "计算机", "建筑学"的课程是哪些
    data = db.course.find({"课程专业": ["土木工程", "计算机", "建筑学"]})
    for item in data:
        print item
    // 查询结果
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"),
            "课程专业" : [
                    "土木工程",
                    "计算机",
                    "建筑学"
            ],
            "price" : 666,
            "name" : "上海财经大学"
    }
    
  • 查询整个数组(数组内容只需包含):db.集合名.find({"字段:{"$all":["值1", "值2"]})

    // 查询课程专业包含"计算机"或"土木工程"的都有哪些课程
    data = db.course.find({'课程专业': {"$all": ['计算机', '土木工程']}})
    for item in data:
        print item
    // 查询结果
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"),
            "课程专业" : [
                    "土木工程",
                    "计算机",
                    "建筑学"
            ],
            "price" : 666,
            "name" : "上海财经大学"
    }
    
  • 查询数组某个元素db.集合名.find("字段名":"数组中的值")

    // 查询课程专业名是"古建筑"的课程都有哪些
    data = db.course.find({"课程专业": "古建筑"})
    for item in data:
        print item
    // 查询结果
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"),
            "课程专业" : [
                    "古建筑",
                    "软件工程"
            ],
            "price" : 888,
            "name" : "哈尔滨工业大学"
    }
    
  • 通过数组索引查询元素db.集合名.find({"字段名.索引": "数组内索引所对应的值"})

    // 查询课程专业第一个名为"土木工程"都有哪些课程
    data = db.course.find({"课程专业.0": "土木工程"})
    for item in data:
        print item
    // 查询结果:
    // 查询结果
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"),
            "课程专业" : [
                    "土木工程",
                    "计算机",
                    "建筑学"
            ],
            "price" : 666,
            "name" : "上海财经大学"
    }
    
  • 查询字段存在的元素existsdb.集合名.find({"字段名":{"$exists":False| True}})

    // 查询有课程名的课程都有哪些
    data = db.course.find({"name": {"$exists": True}})
    for item in data:
        print item
    // 查询结果:
    {
            "_id" : ObjectId("5ca07b91d04ac325ec77ab66"),
            "price" : 1888,
            "name" : "清华大学"
    }
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"),
            "课程专业" : [
                    "土木工程",
                    "计算机",
                    "建筑学"
            ],
            "price" : 666,
            "name" : "上海财经大学"
    }
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"),
            "课程专业" : [
                    "古建筑",
                    "软件工程"
            ],
            "price" : 888,
            "name" : "哈尔滨工业大学"
    }
    

3.修改文档:

  • 修改一条文档db.集合名.update_one(filter={"查询条件"}, update= {"$set": {"修改目标"})

    // 查询上海财经大学,将该课程的价格更改成999元
    data = db.course.update_one(filter={"name": "上海财经大学"}, update={"$set": {"price": 999}})
    print data // <pymongo.results.UpdateResult object at 0x0000000004156C18>返回结果是一个对象
    
    // 可以看到上海财经大学课程价格更改成999元
    > db.course.find()
    { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 999, "name" : "上海财经大学" }
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" }
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
    
  • 修改多条文档db.集合名.update_many(filter={"查询条件"}, update={"$set":{"修改目标"}})

    • 修改的字段存在就更新字段对应的值,若不存在就创建新的字段
    // 将课程价格大于100元的课程,添加字段desc,并且创建对应的值名
    data = db.course.update_many({'price': {"$gt": 100}}, {"$set": {"desc": "最好的考研平台!"}})
    
    
    // 查询结果: 可以看出来课程以前没有desc字段,使用批量更新的时候创建了desc的字段
    > db.course.find().pretty()
    {
            "_id" : ObjectId("5ca07b91d04ac325ec77ab66"),
            "price" : 1888,
            "name" : "清华大学",
            "desc" : "最好的考研平台!"
    }
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"),
            "课程专业" : [
                    "土木工程",
                    "计算机",
                    "建筑学"
            ],
            "price" : 666,
            "name" : "上海财经大学",
            "desc" : "最好的考研平台!"
    }
    {
            "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"),
            "课程专业" : [
                    "古建筑",
                    "软件工程"
            ],
            "price" : 888,
            "name" : "哈尔滨工业大学",
            "desc" : "最好的考研平台!"
    }
    

4.删除文档:

  • 删除一条文档db.集合名.delete_one({})

    data = db.course.delete_one({})  // 条件写的是什么, 只删除一条数据
    print data
    <pymongo.results.DeleteResult object at 0x0000000003EF3CA8>  // 返回结果是一个对象
    
    // 可以看到将上海财经大学的文档已经删除
    > db.course.find()
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" }
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
    
  • 删除多条文档db.集合名.delete_many({"过滤条件"})

    // 删除文档时注意过滤条件, 否则将集合中所有文档都删除
    // 删除课程价格为1688的文档
    data = db.course.delete_many({"price": 1688})  
    print data // <pymongo.results.DeleteResult object at 0x0000000003DB1CA8>返回结果是一个对象
    
    // 删除前,该集合中的数据
    > db.course.find() 
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" }
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
    { "_id" : ObjectId("5ca082d938bffb822439b7f3"), "name" : "哈尔滨工业大学", "price" : 1688 }
    // 删除后, 该集合中的数据
    > db.course.find() // 该课程中有两门课程时1688元, 所以删除多条文档后,只剩下了一条文档
    { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
    

四、运算符列表:

名称 描述
$or 逻辑或
$eq 等于
$gt 大于
$gte 大于等于
$in 在数组中
$lt 小于
$lte 小于等于
$ne 不等于
$nin 不在数组中
$elemMatch 数组元素满足
$all 数组包含元素
$slice 数组切片
$type 字段值类型检查
$exists 字段是否存在判断
$set 更新字段的值
$currentDate 设定某字段的值为当前日期时间
$inc 增加某字段的值
$push 为数组字段添加新的元素