MongoDB增删改查的python操作

前置知识

如果你已经大致了解了MongoDB的基本概念,请跳到第二节。
MongoDB文档数据库的存储结构分为四个层次,从大到小依次是:

  • 数据库database
  • 集合collection
  • 文档document
  • 键值对 key-value pair

数据库由集合组成,集合没有固定的结构,一个集合是一些文档构成的对象。考虑到集合可以插入任意格式和类型的数据,一个集合没有固定的标准,那么就有一个问题:我们该如何得知一个文档该插入哪个集合呢?所以,通常情况下插入集合的数据都会有一定的关联性,以某个主题或者在语义区分。与关系数据库的区别也就仅仅在于集合内的结构了。所以可以说非关系型的数据库(如MongoDB) 玩法更多,使用更灵活。

然后谈谈文档。文档是MongoDB的核心概念,是数据的基本单元,与关系数据库中的行十分类似。文档是一组有序的键值对集合。在同一个集合当中的文档不要求键保持一致,例如,一个集合可能包含用户信息,但每个用户文旦更可以包含不同的信息,如用户名、年龄、电子邮件地址等,而这些字段并不是所有文档都必须具备的。虽然集合不强制要求文档结构,但是数据建模的不同可能会影响程序性能和数据库容量。文档之间的关系是数据建模需要考虑的重要因素。文档与文档之间的关系包括嵌入和引用两种。

文档的数据结构与JSON相同,所有存储在集合中的数据都是BSON格式。(*BSON: Binary JSON)

键值对,键key起到唯一索引的作用,一个键对应一个值,一个值不是指数值而是数据。数据可以是列表list包含着的一组key-value,也可以是单独的string, int, double, char, bool,甚至是png,jpg等等

Create operation

  • 插入多个文档

    import pymongo
    
    client = pymongo.MongoClient(host='localhost', port=27017)
    
    db = client.market
    
    coll = db.customer
    
    docs = [
        {"name": "zhao", "age": 20, "gender": "male", "hasCar": False},
        {"name": "wang", "age": 33, "gender": "male", "hasCar": True},
        {"name": "lu", "age": 23, "gender":"female", "hasCar": True}
    ]
    result = coll.insert_many(docs)
    
    cursor = coll.find()
    for doc in cursor:
        print(doc)
    
    client.close()
    
  • 插入单个文档

    doc = {"name": "an", age: 24}
    result = coll.inset_one(doc)
    

Retrieve operation

  • 基本语法:

    find({查询条件}, {返回字段})
    # 返回字段这里,1表示返回,0表示不返回
    
  • 查看整体信息

    import pymongo
    
    client = pymongo.MongoClient(host='localhost', port=27017)
    
    dblist = client.list_database_names() ### 查看所有数据库信息
    print(dblist) # ['admin', 'config', 'items', 'local', 'market']
    
    db = client.market
    
    collist = db.list_collection_names() ### 查看当前数据库下所有集合信息
    print(collist) # ['users', 'places', 'items', 'customer']
    
    client.close()
    
  • 查看集合内所有文档信息

    import pymongo
    
    client = pymongo.MongoClient(host='localhost', port=27017)
    
    db = client.items
    
    coll = db.items
    
    cursor = coll.find()
    
    for doc in cursor:
        print(doc)
    
    client.close()
    
  • 使用等值条件检索特定信息

    import pymongo
    
    client = pymongo.MongoClient(host='localhost', port=27017)
    
    db = client.market
    
    coll = db.customer
    
    cursor = coll.find({"age": 14}) # 保存了所有包含这个键值对的文档
    # cursor = coll.find({"age": 21, "name": "zhang"}) 也可以使用多个键值对匹配
    
    for doc in cursor:
        print(doc)
    
    client.close()
    
  • 使用比较运算符检索信息

    $lt是小于, g t 是大于, gt是大于, gt是大于,gte 大于等于, l t e 小于等于, lte小于等于, lte小于等于,eq等于,$ne不等于.

    mongodb当中使用运算符都是以key-value的形式。所以前面的key就要加上匹配符,用法如下:

    import pymongo
    
    client = pymongo.MongoClient(host='localhost', port=27017)
    
    db = client.market
    
    coll = db.customer
    
    cursor = coll.find({"age": {"$lt": 20}}) # 小于20;
    
    for doc in cursor:
        print(doc)
    
    client.close()
    
  • 多个条件的AND检索

    cursor = coll.find(
        {"$and":[{"age":{"$lt": 20}}, {"name":"gao"}]}
    )
    
  • 多个条件的OR检索

    cursor = coll.find(
       {"$or":[{"age":{"$gt":20}}, {"age":{"$lt": 15}}]}
    )
    
  • 排序SORT

    collection.find().sort('排序参数', 排序顺序)
    # 排序顺序: 1升序, -1降序
    

Update operation

  • 基本语法

    collection.update_one(para1, para2) # 只更新第一个符合目标的
    collection.update_many(para1, para2) # 更新所有符合目标的
    # para1,para2都是字典且不能省略
    # para1表示需要更新的目标
    # para2表示更新的内容
    
  • 更新多条数据

    target = {"age": {"$lt": 23}}
    context = {"$set": {"age": 24}}
    
    result = coll.update_many(target, context)
    
    print("update number:", result.modified_count)
    
  • 替换文档

    collection.replace_one(para1, para2)
    # para1 要替换的目标的值()
    # para2 被替换的内容
    # replace_one只会替换第一个符合条件的文档,但是替换的是全部的文档内容,而非只有para1的内容
    
  • 更新操作符 [本文只做简单概述,不探讨用法和例子]

    MongoDB当中还包含了很多更新操作符,这些修饰符可用在更新操作中,例如 db.collection.update_many()db.collection.findAndModify()

    基本的使用语法是

    {
    	<operator1>: {<field1>: <value1>, ...},
    	<operator2>: {<field2>: <value2>, ...},
    	...
    }
    

    字段相关的更新操作符有:

    • $currentDate 将字段的值设置为当前日期,可以是日期或时间戳
    • $inc 将字段的值按照指定量递增
    • $min 仅当指定值小于现有字段值时才更新字段
    • $max 仅当指定值大于现有字段值时才更新字段
    • $mul 将字段的值乘以指定量
    • $rename 重命名字段
    • $set 设置文档中字段的值
    • $setOnInsert 如果某一更新操作导致插入文档,则设置字段的值,对现有修改文档的更新操作没有影响。
    • $unset 从文档中删除指定的字段

    阵列相关的操作符

    • $ 充当占位符,用于更新与查询条件匹配的第一个元素
    • $[] 充当占位符,以更新数组中与查询条件匹配的文档中的所有元素。
    • $[] 充当占位符,以更新与查询条件匹配的文档中所有符合 arrayFilters 条件的元素。
    • $addToSet 仅向数组中添加尚不存在于该数组的元素。
    • $pop 删除数组的第一项或最后一项。
    • $pull 删除与指定查询匹配的所有数组元素。
    • $push 向数组添加一项。
    • $pullAll 从数组中删除所有匹配值。

    阵列相关的修饰符

    • $each 修改 pushaddToSe运算符,以在数组更新时追加多个项目。
    • $position 修改 push运算符,以指定在数组中添加元素的位置。
    • $slice 修改 push 运算符以限制更新后数组的大小。
    • $sort 修改 push 运算符,以对存储在数组中的文档重新排序。

    这些操作符具体的用法和例子我会在后面进行更新。

Delete operation

doc = {
    "age":{"$gt":29}
}

result = coll.delete_many(doc)

print("delete number:", result.deleted_count)

去重使用distinct方法

collection.distinct('键名')

参考

https://www.cnblogs.com/testlearn/p/15045172.html
https://blog.csdn.net/weixin_44904817/article/details/105975704

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayu阿予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值