zoukankan      html  css  js  c++  java
  • python操作MongoDB数据库

    上一篇文章中介绍了怎么用python连接MongoDB数据库,现在写一下python控制MongoDB进行增删改查操作。

    首先连接数据库:

    import  pymongo
    # 连接数据库
    myclient = pymongo.MongoClient("mongodb://localhost:27017/")
    mydb = myclient["mydb"]
    mycol = mydb["col"]

    Python MongoDB增加数据

    插入一条记录:

    x=mycol.insert_one({"name":"刘飞","age":19})
    print(x)

    输出结果:

    <pymongo.results.InsertOneResult object at 0x02A45620>

    insert_one() 方法返回 InsertOneResult 对象,可使用下面方法查看对象所有的属性:

    x=mycol.insert_one({"name":"刘飞","age":19})
    print(dir(x))
    #输出结果 [
    '_InsertOneResult__acknowledged', '_InsertOneResult__inserted_id', '_WriteResult__acknowledged', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_raise_if_unacknowledged', 'acknowledged', 'inserted_id']

    该对象包含 inserted_id 属性,它是插入文档的 id 值。如果我们在插入文档时没有指定 _id,MongoDB 会为每个文档添加一个唯一的 id

    x=mycol.insert_one({"name":"刘飞","age":19})
    print(x.inserted_id)
    #输出结果 5d43d8189f5e382760e25acf

    插入多个文档:

    集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。

    mylist = [
      { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
      { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
      { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
      { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
      { "name": "Github", "alexa": "109", "url": "https://www.github.com" }
    ]
    x = mycol.insert_many(mylist)
     
    # 输出插入的所有文档对应的 _id 值
    print(x.inserted_ids)
    
    #输出结果
    [ObjectId('5d43d9069f5e38272c69fc07'), ObjectId('5d43d9069f5e38272c69fc08'), ObjectId('5d43d9069f5e38272c69fc09'), ObjectId('5d43d9069f5e38272c69fc0a'), ObjectId('5d43d9069f5e38272c69fc0b')]

    insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值。

    执行完以上查找,我们可以在命令终端,查看数据是否已插入:

    插入指定id的多个文档:

    #先删除之前插入的所有文档
    x=mycol.delete_many({})
    print(x.deleted_count, "个文档已删除")
    #输出结果 11 个文档已删除
    mylist = [
        {"_id": 1, "name": "RUNOOB", "cn_name": "菜鸟教程"},
        {"_id": 2, "name": "Google", "address": "Google 搜索"},
        {"_id": 3, "name": "Facebook", "address": "脸书"},
        {"_id": 4, "name": "Taobao", "address": "淘宝"},
        {"_id": 5, "name": "Zhihu", "address": "知乎"}
    ]
    
    x = mycol.insert_many(mylist)
    
    # 输出插入的所有文档对应的 _id 值
    print(x.inserted_ids)
    
    #输出结果
    [1, 2, 3, 4, 5]

    执行完以上查找,我们可以在命令终端,查看数据是否已插入:

     Python MongoDB 删除数据

     删除单个文档:

    我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

    本文使用的测试数据如下:

     

    x=mycol.delete_one({"name":"Google"})
    print(x.deleted_count,'个文档已删除')
    
    #输出结果
    1 个文档已删除

    删除多个文档:

    我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

    删除所有 name 字段中以 F 开头的文档:

    myquery = {"name": {"$regex": "^F"}}
    x = mycol.delete_many(myquery)
    print(x.deleted_count, "个文档已删除")
    
    #输出结果
    2 个文档已删除

    删除集合中所有的文档:

    x = mycol.delete_many({})
    print(x.deleted_count, "个文档已删除")
    
    #输出结果
    7 个文档已删除

    删除集合:

    mycol.drop()

    如果删除成功 drop() 返回 true,如果删除失败(集合不存在)则返回 false。

    我们使用以下命令在终端查看集合是否已删除:

    Python MongoDB 修改文档

    修改一条记录

    在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。如果查找到的匹配数据多余一条,则只会修改第一条。

     本文使用的测试数据如下

    将 alexa 字段的值 10000 改为 12345:

    mycol.update_one({"alexa":'100'},{'$set':{"alexa":"123456"}})
    for i in mycol.find():
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}

    修改多条记录

    使用 update_many()。查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123

    x=mycol.update_many({"name":{"$regex":"^F"}},{"$set":{"alexa":"123"}})
    print(x.modified_count,'个文档已修改')
    
    #输出结果
    1 个文档已修改

    Python MongoDB 查询文档

    MongoDB 中使用了 find 和 find_one 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。

    本文使用的测试数据如下

    使用 find_one() 方法来查询集合中的一条数据。

    x = mycol.find_one()
    print(x)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}

    find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。

    for i in mycol.find():
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}

    查询指定字段的数据

    我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。

    for i in mycol.find({},{"_id":0,"name":1,"url":1}):
        print(i)
    
    #输出结果
    {'name': 'Taobao', 'url': 'https://www.taobao.com'}
    {'name': 'QQ', 'url': 'https://www.qq.com'}
    {'name': 'Facebook', 'url': 'https://www.facebook.com'}
    {'name': '知乎', 'url': 'https://www.zhihu.com'}
    {'name': 'Github', 'url': 'https://www.github.com'}

    除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。

    以下实例除了 alexa 字段外,其他都返回:

    for i in mycol.find({},{"alexa":0}):
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'url': 'https://www.qq.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'url': 'https://www.github.com'}

    以下代码同时指定了 0 和 1 则会报错

    for i in mycol.find({},{"alexa":0,"name":1}):
        print(i)
    
    #报错信息
    pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion.

    根据指定条件查询

    在 find() 中设置参数来过滤数据。查找 name 字段为 "QQ" 的数据:

    mydoc = mycol.find({"name":"QQ"})
    for i in mydoc:
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}

    高级查询

    查询的条件语句中,我们还可以使用修饰符。

    读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据,大于的修饰符条件为 {"$gt": "H"} :

    mydoc = mycol.find({"name":{"$gt":"H"}})
    for i in mydoc:
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}

    使用正则表达式查询

    正则表达式修饰符只用于搜索字符串的字段。

    读取 name 字段中第一个字母为 "T" 的数据,正则表达式修饰符条件为 {"$regex": "^T"} :

    mydoc = mycol.find({"name":{"$regex":"^T"}})
    for i in mydoc:
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}

    返回指定条数记录

    如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。

    mydoc = mycol.find().limit(3)
    for i in mydoc:
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}

    排序

    sort() 方法可以指定升序或降序排序。

    sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。

    对字段 alexa 按升序排序:

    mydoc = mycol.find().sort('alexa')
    for i in mydoc:
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}

    对字段 alexa 按降序排序:

    mydoc = mycol.find().sort('alexa',-1)
    for i in mydoc:
        print(i)
    
    #输出结果
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
    {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}

    done

    参考资料:https://www.runoob.com/python3/python-mongodb.html

  • 相关阅读:
    meta 标签禁止缩放失效
    [UE4]打包EXE
    [UE4]Set Array Elem
    [UML]用例图
    [UE4]函数参数引用
    阻止移动鼠标双击页面放大, no double tap
    spring boot入门 -- 介绍和第一个例子
    SpringBoot 启动错误搜集
    spring boot 启动找不到或无法加载主类
    Spring Boot中Starter是什么
  • 原文地址:https://www.cnblogs.com/nmsghgnv/p/11289316.html
Copyright © 2011-2022 走看看