Python操作Mongodb

客户端

客户端连接

$ bin/mongo.exe
MongoDB shell version v3.6.13
help 打开帮助

show dbs     #查看当前有哪些库

use blog     #有就切换过去,没有就创建后切换过去。刚创建的并不在数据库列表中,需要写入数据后才能看到

db           #查看当前数据库

db.users.insert({user:"tom", age:20}) #db指代当前数据库;users集合名

也可以使用官方的可视化工具Compass。https://www.mongodb.com/products/compass

连接地址mongodb://127.0.0.1:27017

Pycharm插件

在settings/plugins中输入mongo,安装Mongo Plugin,完成后重启Pycharm。

菜单项View/Tool Windows/Mongo Explorer

Python连接

开发指南https://docs.mongodb.com/guides/server/drivers/

Mongodb官方推荐使用pymongo。

参看 https://docs.mongodb.com/ecosystem/drivers/pymongo/

缺省安装pymongo 3.x,支持MongoDB2.6+,兼容Python 3.4+。

mongodb的连接字符串

mongodb://username:password@127.0.0.1:27017/test

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'

# 上下文管理连接数据库
#两种方法
#with MongoClient(host='127.0.0.1', port=27017) as cli:
with MongoClient(url) as cli:
    
    # 使用数据库 两种方法都可以
    #db: Database = cli['user']
    db: Database = cli.user
        
    print(type(db))
    
    # 使用表 两种方法都可以
    #table: Collection = db['pa']
    table: Collection = db.pa
        
    print(type(table), table)
    # 添加记录
    table.insert_one({
        "a": 123
    })
    # 查看所有记录
    l = table.find()
    print(*l)
    
"""
<class 'pymongo.database.Database'>
<class 'pymongo.collection.Collection'> Collection(Database(MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True), 'user'), 'pa')
{'_id': ObjectId('61cb6292d8661642727b45bb'), 'a': 1, 'b': 2} {'_id': ObjectId('61cb66ef62ae9435ee42c319'), 'a': 123}
"""

既能用属性访问,又能像key一样访问,一定用到了魔术方法的__getattr____getitem__

例子

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection
from pymongo.cursor import Cursor

config = {
    'host'    : '10.0.0.12',
    'port'    : 27017,
    'username': 'root',
    'password': '111111'
}

with MongoClient(**config) as client:
    # 拿数据库
    db: Database = client.test2
    print(db, type(db))
    # 拿集合
    table: Collection = db["users"]
    print(table, type(table))
    # 获取所有文档
    l: Cursor = table.find()
    print(l, type(l))
    for i in l:
        print(i, type(i))
        
"""
Database(MongoClient(host=['10.0.0.12:27017'], document_class=dict, tz_aware=False, connect=True), 'test2') <class 'pymongo.database.Database'>
Collection(Database(MongoClient(host=['10.0.0.12:27017'], document_class=dict, tz_aware=False, connect=True), 'test2'), 'users') <class 'pymongo.collection.Collection'>
<pymongo.cursor.Cursor object at 0x000001AA5D0343D0> <class 'pymongo.cursor.Cursor'>
{'_id': ObjectId('658a46c4a21f64aef85fa8ac'), 'a': 'b'} <class 'dict'>
{'_id': ObjectId('658a48dea21f64aef85fa8ad'), 'a': 'b1'} <class 'dict'>
"""

基本概念

MongoDB中可以创建使用多个库,但有一些数据库名是保留的,可以直接访问这些有特殊作用的数据
库。

  • admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
关系数据库(mariadb) mongodb
Database(库) Database
Table(表) Collection
Row(记录) Document
Column(字段) Field
Join(连接) Embedded Document嵌入文档或Reference引用
Primary Key(主键) 主键 (MongoDB提供了key为 _id )

插入数据

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    print(type(db))
    # 使用表
    table: Collection = db.pa
    print(type(table), table)
    # 添加记录
    i=table.insert_one({
        "a": 123
    })
    #返回id
    print(i.inserted_id)
    # 查看所有记录
    l = table.find()
    print(*l)

每条数据插入后都有一个唯一key,属性_id 唯一标识一个文档。没有没有显式指明该属性,会自动生成一个ObjectId类型的_id 属性。

ObjectId有12字节组成

  • 4字节时间戳
  • 3字节机器识别码
  • 2字节进程id
  • 3字节随机数
import datetime
 
i="61cb7db5fd08a5cc3fe73059"
print(datetime.datetime.fromtimestamp(int(i[:8],16)))

import bson

print(bson.ObjectId(i).generation_time)

文档

每一条记录对应一个文档,其格式使用BSON。BSON即Binary JSON。

类型参考 https://docs.mongodb.com/v3.6/reference/bson-types/

文档

  • 文档中,使用键值对

  • 文档中的键/值对是有序的

  • 键是字符串

    • 区分大小写,使用UTF-8字符

    • 键不能含有\0 (空字符)。这个字符用来表示键字符串的结尾

      .$ 有特别的意义,只有在特定环境下才能使用

      以下划线_ 开头的键是保留的,例如_id

  • 值可以是

    • 字符串、32位或64位整数、双精度、时间戳(毫秒)、布尔型、null
    • 字节数组、BSON数组、BSON对象

查询

单条查询

只返回一条,且为字典,不为对象

find_one第一参数是filter(过滤条件),相当于SQL的where子句。

# 查询
result = users.find_one({'name':'tom'})
print(type(result), result) # 返回字典带_id

# 使用key查询
from bson.objectid import ObjectId

result = users.find_one({'_id':ObjectId('5d48d95d4fd47046028b8e54')})
print(type(result), result)
result = users.find_one({'name':'tommy'})
print(type(result), result) # 查不到,返回None

多条查询

返回多条,且为惰性生成器对象,需要主动遍历

# 多条查询
results = users.find({'name':'tom'})
print(type(results)) # pymongo.cursor.Cursor对象
print(results) # 可迭代对象
for x in results:
    print(type(x), x) # 字典

返回游标,可迭代对象

查询操作

比较

不同BSON类型值的比较参见指定的BSON比较顺序

名称 描述 范例
$eq 等于= { <field>: { $eq: <value> } }或者直接写{ field: <value> }
$gt 大于> db.inventory.find( { qty: { $gt: 20 } } )qty大于20的项e
$gte 大于等于>= db.inventory.find( { qty: { $gte: 20 } } )qty大于等于20的项
$in 在集合里面 in db.inventory.find( { quantity: { $in: [ 5, 15 ] } } )
$lt 小于< db.inventory.find( { qty: { $lt: 20 } } )
$lte 小于等于<= db.inventory.find( { qty: { $lte: 20 } } )
$ne 不等于!= db.inventory.find( { qty: { $ne: 20 } } )
$nin 不在集合里面 not in db.inventory.find( { quantity: { $nin: [ 5, 15 ] } } )

逻辑

名称 描述 范例
$and db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } )
price不等于1.99且price存在
$not db.inventory.find( { price: { $not: { $gt: 1.99 } } } )
price不大于1.99或者不存在
$or db.inventory.find( { $or: [ { quantity: 20 }, { price: 10 } ] } )
quantity=20或者price=10

元素

名称 描述 范例
$exists 存在 db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )
qty存在且不在[5,15]中
$type 类型 db.inventory.find({ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } })
db.inventory.find({'b': {'$type': 16}})b类型为短整

type数据类型(BSON type)

Number Alias Notes
Double 1 "double"
String 2 "string"
Object 3 "object"
Array 4 "array"
Binary data 5 "binData"
ObjectId 7 "objectId"
Boolean 8 "bool"
Date 9 "date"
Null 10 "null"
Regular Expression(正则表达式) 11 "regex"
JavaScript 13 "javascript"
32-bit integer(短整) 16 "int"
Timestamp(时间戳) 17 "timestamp"
64-bit integer(长整) 18 "long"
Min key -1 "minKey"
Max key 127 "maxKey"

评估

名称 描述 范例
$expr 允许在查询语言中使用聚合表达式。
$mod 取模 db.inventory.find({'a': {'$mod': [3, 1]}})
用a的值与3取余,余1的返回
$regex 正则表达式匹配 db.inventory.find({'b': {'$regex': '^s'}})
返回b的值以s开头的
$where 匹配满足 JavaScript 表达式的文档。

地理空间

名称 描述 范例
$geoIntersects 选择与GeoJSON几何相交的几何。该2dsphere索引支持 $geoIntersects
$geoWithin 在边界GeoJSON 几何中选择几何。该2dsphere2D指标支持 $geoWithin
$near 返回点附近的地理空间对象。需要地理空间索引。该2dsphere2D指标支持 $near
$nearSphere 返回球体上某个点附近的地理空间对象。需要地理空间索引。该2dsphere2D指标支持 $nearSphere

数组

名称 描述 范例
$all 匹配包含查询中指定的所有元素的数组。
$elemMatch 如果数组字段中的元素与所有指定$elemMatch条件匹配,则选择文档。
$size 如果数组字段是指定大小,则选择文档。

按位

名称 描述 范例
$bitsAllClear 匹配其中一组位位置的数值或二进制值具有值0
$bitsAllSet 匹配其中一组位位置的数值或二进制值具有值1
$bitsAnyClear 匹配数字或二进制值,其中来自一组位位置的任何位的值为0
$bitsAnySet 匹配数字或二进制值,其中来自一组位位置的任何位的值为1

投影

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # 使用表
    table: Collection = db.pa
        
    #投影所有
    print(*table.find({'qty': 100}), sep='\n')
    # {'_id': ObjectId('61ccadbaa4c36483d0e8003e'), 'item': 'paper', 'qty': 100, 'size': {'h': 8.5, 'w': 11, 'uom': 'in'}, 'status': 'D'}
    
    #投影'item', 'qty', 'status'这三个,这里会默认显示_id
    print(*table.find({'qty': 100}, ['item', 'qty', 'status']), sep='\n')
    # {'_id': ObjectId('61ccadbaa4c36483d0e8003e'), 'item': 'paper', 'qty': 100, 'status': 'D'}
    
    #投影'item', 'qty', 'status',用的是白名单,默认显示_id
    print(*table.find({'qty': 100}, {'item': 1, 'qty': True, 'status': 1}), sep='\n')
    #{'_id': ObjectId('61ccadbaa4c36483d0e8003e'), 'item': 'paper', 'qty': 100, 'status': 'D'}
    
    #使用黑名单投影,除了'_id','size'中的'w' ,'status' 其他的都投影
    print(*table.find({'qty': 100}, {'_id': False, 'size.w': False, 'status': 0}), sep='\n')
    #{'item': 'paper', 'qty': 100, 'size': {'h': 8.5, 'uom': 'in'}}

聚合

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # 使用表
    table: Collection = db.pa
    #先匹配a存在的,然后聚合条数
    x=table.aggregate([
        {'$match':{'a':{'$exists':1}}},
        {'$count':'a的个数'}
    ])
    #{'a的个数': 9}
    
    x=table.aggregate([
        #先匹配
        {'$match':{'qty':{'$exists':1}}},
        #再分组求和 w_sum是自定义名称,作为求和后结果的key
        {'$group':{'_id':'$size.h','w_sum':{'$sum':'$size.w'}}},
        #最后再排序
        #1表示升序
        #-1表示降序
        {'$sort': {'_id':1}}
    ])
    """
    {'_id': 8.5, 'w_sum': 22}
    {'_id': 10, 'w_sum': 15.25}
    {'_id': 14, 'w_sum': 21}
    {'_id': 22.85, 'w_sum': 30}
    """
    print(*x,sep='\n')

排序

from pymongo import MongoClient,DESCENDING,ASCENDING
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # 使用表
    table: Collection = db.pa
    #先过滤,再根据'size.w'倒序,'size.w'相同就用'qty'顺序排列,ASCENDING顺序可以省略
    x=table.find({'qty':{'$exists':1}}).sort([('size.w',DESCENDING),('qty',ASCENDING)])
    print(*x,sep='\n')

分页

from pymongo import MongoClient,DESCENDING,ASCENDING
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # 使用表
    table: Collection = db.pa
        
        
        
    #跳过两个,取3个
    x=table.find().limit(3).skip(2)
    print(*x,sep='\n')

skip 跳过几个,limit限制结果个数。

也可在其他分组后使用

更新

更新操作 含义 实例
$inc | 对给定字段数字值增减 | {'$inc':{'age':-5}}
$set | 设置字段值,如果字段不存在则创建 | {'$set':{'gender':'M'}}
$unset | 移除字段 | {'$unset':{'Name':""}}
  • update_one

    只修改匹配到的第一个
    对数字操作$inc

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    filte = {'qty': 25}
    all_list = table.find(filte)
    print(*all_list, sep='\n')
    print('=' * 100)
    #对匹配到的文档,'size.h'-2,'size.w'+2
    u = table.update_one(filte, {'$inc': {'size.h': -2, 'size.w': 2}})
    print('匹配:', u.matched_count)
    print('更新:', u.modified_count)
    print('更新行的id:', u.upserted_id)
    print('=' * 100)
    all_list = table.find(filte)
    print(*all_list, sep='\n')
    
"""
结果
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'item': 'journal', 'qty': 25, 'size': {'h': 10, 'w': 25, 'uom': 'cm'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9db'), 'item': 'journal', 'qty': 25, 'size': {'h': 14, 'w': 21, 'uom': 'cm'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9dd'), 'item': 'mousepad', 'qty': 25, 'size': {'h': 19, 'w': 22.85, 'uom': 'cm'}, 'status': 'P'}
====================================================================================================
匹配: 1
更新: 1
更新行的id: None
====================================================================================================
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'item': 'journal', 'qty': 25, 'size': {'h': 8, 'w': 27, 'uom': 'cm'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9db'), 'item': 'journal', 'qty': 25, 'size': {'h': 14, 'w': 21, 'uom': 'cm'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9dd'), 'item': 'mousepad', 'qty': 25, 'size': {'h': 19, 'w': 22.85, 'uom': 'cm'}, 'status': 'P'}
"""
from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    filte = {'qty': 25}
    all_list = table.find(filte)
    print(*all_list, sep='\n')
    print('=' * 100)
    u = table.update_many(filte, {'$set': {'size.uom': 'www'}})
    print('匹配:', u.matched_count)
    print('更新:', u.modified_count)
    print('=' * 100)
    all_list = table.find(filte)
    print(*all_list, sep='\n')
"""
结果
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'item': 'journal', 'qty': 25, 'size': {'h': 48, 'w': 27, 'uom': 'www'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9db'), 'item': 'journal', 'qty': 25, 'size': {'h': 14, 'w': 21, 'uom': 'cm'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9dd'), 'item': 'mousepad', 'qty': 25, 'size': {'h': 19, 'w': 22.85, 'uom': 'cm'}, 'status': 'P'}
====================================================================================================
匹配: 3
更新: 2
====================================================================================================
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'item': 'journal', 'qty': 25, 'size': {'h': 48, 'w': 27, 'uom': 'www'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9db'), 'item': 'journal', 'qty': 25, 'size': {'h': 14, 'w': 21, 'uom': 'www'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9dd'), 'item': 'mousepad', 'qty': 25, 'size': {'h': 19, 'w': 22.85, 'uom': 'www'}, 'status': 'P'}
"""

移除字段$unset

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    filte = {'qty': 25}
    all_list = table.find(filte)
    print(*all_list, sep='\n')
    print('=' * 100)
    u = table.update_many(filte, {'$unset': {'size.ppp': ''}})
    print('匹配:', u.matched_count)
    print('更新:', u.modified_count)
    print('=' * 100)
    all_list = table.find(filte)
    print(*all_list, sep='\n')
"""
结果
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'item': 'journal', 'qty': 25, 'size': {'h': 48, 'w': 27, 'uom': 'www', 'ppp': 'abc'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9db'), 'item': 'journal', 'qty': 25, 'size': {'h': 14, 'w': 21, 'uom': 'www'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9dd'), 'item': 'mousepad', 'qty': 25, 'size': {'h': 19, 'w': 22.85, 'uom': 'www'}, 'status': 'P'}
====================================================================================================
匹配: 3
更新: 1
====================================================================================================
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'item': 'journal', 'qty': 25, 'size': {'h': 48, 'w': 27, 'uom': 'www'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9db'), 'item': 'journal', 'qty': 25, 'size': {'h': 14, 'w': 21, 'uom': 'www'}, 'status': 'A'}
{'_id': ObjectId('61cdee229cb0723f93bce9dd'), 'item': 'mousepad', 'qty': 25, 'size': {'h': 19, 'w': 22.85, 'uom': 'www'}, 'status': 'P'}
"""

替换与过滤器匹配的单个文档。

匹配到多个,也只更新一个

from pymongo import MongoClient
# 使用_id来查询,需要导入ObjectId
from bson.objectid import ObjectId
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    filte = {'_id': ObjectId('61ccadbaa4c36483d0e8003c')}
    all_list = table.find(filte)
    print(*all_list, sep='\n')
    print('=' * 100)
    u = table.replace_one(filte, {'a': 1, 'b': 2})
    print('匹配:', u.matched_count)
    print('更新:', u.modified_count)
    print('=' * 100)
    all_list = table.find(filte)
    print(*all_list, sep='\n')
"""
结果
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'item': 'journal', 'qty': 25, 'size': {'h': 48, 'w': 27, 'uom': 'www'}, 'status': 'A'}
====================================================================================================
匹配: 1
更新: 1
====================================================================================================
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'a': 1, 'b': 2}
"""

也可以使用upsert选项来,在未匹配到的情况下,将替换文档插入为新的文档

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    filte = {'a': 2}
    all_list = table.find(filte)
    print(*all_list, sep='\n')
    print('=' * 100)
    u = table.replace_one(filte, {'a': 1, 'b': 2},upsert=True)
    print('匹配:', u.matched_count)
    print('更新:', u.modified_count)
    print('插入的新文档id',u.upserted_id)
    print('=' * 100)
    all_list = table.find({'a': 1, 'b': 2})
    print(*all_list, sep='\n')
    
"""
结果

====================================================================================================
匹配: 0
更新: 0
插入的新文档id 61cdf9500e69d7b9f5f09caa
====================================================================================================
{'_id': ObjectId('61ccadbaa4c36483d0e8003c'), 'a': 1, 'b': 2}
{'_id': ObjectId('61cdf9500e69d7b9f5f09caa'), 'a': 1, 'b': 2}
"""

全文索引

https://docs.mongodb.com/manual/text-search/

创建索引

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    #创建文本索引
    x = table.create_index([('item', 'text'), ('status', 'text')])
    print(type(x),x)

查找

$text将使用空格和大多数标点符号作为分隔符OR对搜索字符串进行标记,并对搜索字符串中的所有此类标记执行逻辑运算。

查询查找包含"paper" "P"的文档

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    #文本搜索
    l=table.find({'$text':{'$search':'paper P'}})
    print(*l,sep='\n')
"""
结果
{'_id': ObjectId('61cdee229cb0723f93bce9de'), 'item': 'notebook', 'qty': 50, 'size': {'h': 8.5, 'w': 11, 'uom': 'in'}, 'status': 'P'}
{'_id': ObjectId('61cdee229cb0723f93bce9dd'), 'item': 'mousepad', 'qty': 25, 'size': {'h': 19, 'w': 22.85, 'uom': 'www'}, 'status': 'P'}
{'_id': ObjectId('61cdee229cb0723f93bce9df'), 'item': 'paper', 'qty': 100, 'size': {'h': 8.5, 'w': 11, 'uom': 'in'}, 'status': 'D'}
{'_id': ObjectId('61ccadbaa4c36483d0e8003e'), 'item': 'paper', 'qty': 100, 'size': {'h': 8.5, 'w': 11, 'uom': 'in'}, 'status': 'D'}
"""

删除

删除匹配到的第一条

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    fil = {'status': 'A'}
    print('目前个数:', table.count_documents(fil))
    print('=' * 50)
    l = table.delete_one(fil)
    print('删除的个数:', l.deleted_count)
    print('返回的信息:', l.raw_result)
    print('=' * 50)
    all_list = table.count_documents(fil)
    print('目前个数:', all_list)
"""
结果
目前个数: 3
==================================================
删除的个数: 1
返回的信息: {'n': 1, 'ok': 1.0}
==================================================
目前个数: 2
"""

删除匹配到的所有

from pymongo import MongoClient
from pymongo.database import Database
from pymongo.collection import Collection

url = 'mongodb://127.0.0.1:27017'
# 上下文管理连接数据库
with MongoClient(url) as cli:
    # 使用数据库
    db: Database = cli.user
    # print(type(db))
    # 使用表
    table: Collection = db.pa
    fil = {'status': 'D'}
    print('目前个数:', table.count_documents(fil))
    print('=' * 50)
    l = table.delete_many(fil)
    print('删除的个数:', l.deleted_count)
    print('返回的信息:', l.raw_result)
    print('=' * 50)
    all_list = table.count_documents(fil)
    print('目前个数:', all_list)
    
"""
结果
目前个数: 3
==================================================
删除的个数: 3
返回的信息: {'n': 3, 'ok': 1.0}
==================================================
目前个数: 0
"""

db.collection.delete_many({}) 删除所有文档,慎用

posted @ 2023-01-31 05:44  厚礼蝎  阅读(136)  评论(0编辑  收藏  举报