Name | oomongo JSON |
Version |
1.1.2
JSON |
| download |
home_page | None |
Summary | 一个非常优雅的 MongoDB ODM |
upload_time | 2024-07-28 23:46:53 |
maintainer | None |
docs_url | None |
author | None |
requires_python | None |
license | None |
keywords |
mongodb
pymongo
motor
oomongo
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# 项目描述
一个非常优雅的 MongoDB ODM 。
# 作者
江南雨上
[主页](https://lcctoor.com/index.html) \| [Github](https://github.com/lcctoor) \| [PyPi](https://pypi.org/user/lcctoor) \| [微信](https://lcctoor.com/cdn/WeChatQRC.jpg) \| [邮箱](mailto:lcctoor@outlook.com) \| [捐赠](https://lcctoor.com/cdn/DonationQRC-0rmb.jpg)
# Bug提交、功能提议
你可以通过 [Github-Issues](https://github.com/lcctoor/arts/issues)、[微信](https://lcctoor.com/cdn/WeChatQRC.jpg) 与我联系。
# 安装
```
pip install oomongo
```
# 教程
本文将以简洁的方式向你介绍核心知识,而不会让你被繁琐的术语所淹没。
## 导入
```python
from pymongo import MongoClient
from motor.motor_asyncio import AsyncIOMotorClient
from oomongo import ODM, mc, mf, mo
```
## 创建ODM
```python
class ODM_2(ODM):
def mkconn(self): # 定义同步连接器
return MongoClient(host='localhost', port=27017)
async def amkconn(self): # 定义异步连接器
return AsyncIOMotorClient(host='localhost', port=27017)
odm = ODM_2() # 账户ODM
db = odm['泉州市'] # 库ODM
sheet = db['希望小学'] # 表ODM
```
## 基础功能 —— 增、查、改、删
【增、查、改、删】的同步方法名称分别为:insert、find、update、delete 。
对应的异步方法名称为各同步方法名前加 `a` ,即:ainsert、afind、aupdate、adelete 。
### 示例
```python
row1 = {'姓名':'小一', '年龄':11, '幸运数字':[1, 2, 3], '成绩':{'语文':81, '数学':82}}
row2 = {'姓名':'小二', '年龄':12, '幸运数字':[2, 3, 4], '成绩':{'语文':82, '数学':83}}
row3 = {'姓名':'小三', '年龄':13, '幸运数字':[3, 4, 5], '成绩':{'语文':83, '数学':84}}
row4 = {'姓名':'小四', '年龄':14, '幸运数字':[4, 5, 6], '成绩':{'语文':84, '数学':85}}
row5 = {'姓名':'小五', '年龄':15, '幸运数字':[5, 6, 7], '成绩':{'语文':85, '数学':86}}
row6 = {'姓名':'小六', '年龄':16, '幸运数字':[6, 7, 8], '成绩':{'语文':86, '数学':87}}
```
| | 同步方式 | 异步方式 |
| :---------: | ----------------------------- | -------------------------------------------------------- |
| 增(1 条) | sheet.insert( row1 ) | **await** sheet.**a**insert( row2 ) |
| 增(批量) | sheet.insert( row3, row4 ) | **await** sheet.**a**insert( row5, row6 ) |
| 查 | sheet.find( ) | **await** sheet.**a**find( ) |
| 改 | sheet.update( {'年龄': 100} ) | **await** sheet.**a**update( {'年龄': 200} ) |
| 删 | sheet.delete( ) | **await** sheet.**a**delete( ) |
### 新增时,查看分配到的主键:
```python
row1 = {'姓名':'小一', '年龄':11, '幸运数字':[1, 2, 3], '成绩':{'语文':81, '数学':82}}
row2 = {'姓名':'小二', '年龄':12, '幸运数字':[2, 3, 4], '成绩':{'语文':82, '数学':83}}
row3 = {'姓名':'小三', '年龄':13, '幸运数字':[3, 4, 5], '成绩':{'语文':83, '数学':84}}
r1 = sheet.insert( row1 )
r2 = sheet.insert( row2, row3 )
```
方法1:使用 insert 添加数据成功后,row1~row3 已各自多了一个叫‘_id’的键,该键的值即分配到的主键。
方法2:
```python
r1.inserted_id
r2.inserted_ids
```
## 注:下文中所有示例都同时支持同步方式和异步方式,将同步示例中的 insert、delete、update、find 替换为 ainsert、adelete、aupdate、afind 即为异步方式,当然,须加上 await 前缀。
## 条件筛选
### 示例一:理解条件筛选的基本范式
筛选【年龄>13,且视力≧4.6,且性别为女】的数据,并进行查改删:
**查询**:`sheet[mc.年龄 > 13][mc.视力 >= 4.6][mc.性别 == '女'].find( )`
**修改**:`sheet[mc.年龄 > 13][mc.视力 >= 4.6][mc.性别 == '女'].update( {'年级':'初一', '爱好':'画画,跳绳'} )`
**删除**:`sheet[mc.年龄 > 13][mc.视力 >= 4.6][mc.性别 == '女'].delete( )`
### 筛选操作清单
| **代码** | 解释 |
| ------------------------------------------------------------------------------ | ----------------------------------------------- |
| mc.年龄 > 10 | 大于 |
| mc.年龄 >= 10 | 大于或等于 |
| mc.年龄 < 10 | 小于 |
| mc.年龄 <= 10 | 小于或等于 |
| mc.年龄 == 10 | 等于 |
| mc.年龄 != 10 | 不等于 |
| mc.年级 == mf.isin( '初三', '高二' ) | 若字段值是传入值的成员,则符合 |
| mc.年龄 == mf.notin( 10, 30, 45 ) | 若字段值不是传入值的成员,则符合 |
| mc.爱好 == mf.contain_all( '画画', '足球' ) | 若(列表)字段值包含传入值的所有元素,则符合 |
| mc.爱好 == mf.contain_any( '画画', '足球' ) | 若(列表)字段值包含传入值的至少1个元素,则符合 |
| mc.爱好 == mf.contain_none( '画画', '足球' ) | 若(列表)字段值不包含传入值的任何元素,则符合 |
| mc.姓名 == mf.re( '小' ) | 正则匹配 |
| \[mc.年龄 > 3\][mc.年龄 < 100] | 交集(方式一) |
| [ (mc.年龄 > 3) & (mc.年龄 < 100) ] | 交集(方式二) |
| [(mc.年龄<30)| (mc.年龄>30) | (mc.年龄==30) | (mc.年龄==None)] | 并集 |
| [ (mc.年龄 > 3) - (mc.年龄 > 100) ] | 差集 |
| [ ~(mc.年龄 > 100) ] | 补集 |
注:
1、isin、notin 用于判断(普通)字段的值是否传入值的成员,针对普通字段。
2、contain_any、contain_none 用于判断传入值是否(列表)字段的值的成员,针对列表字段。
3、isin、notin、contain_all、contain_any、contain_none 的传入值都不必是同类型的数据,以 isin 为例:可以这样使用:mc.tag == mf.isin( 3, 3.5, '学生', None ),传入值含有 int、float、str、NoneType 等多种类型。
4、成员运算符未传入任何值时的处理方式:
| **代码** | **处理方式** |
| ----------------------------- | ------------------ |
| mc.年级 == mf.isin( ) | 所有数据都 不符合 |
| mc.年级 == mf.notin( ) | 所有数据都 符合 |
| mc.爱好 == mf.contain_all( ) | 所有数据都 符合 |
| mc.爱好 == mf.contain_any( ) | 所有数据都 不符合 |
| mc.爱好 == mf.contain_none( ) | 所有数据都 符合 |
5、四种集合运算可以相互嵌套,且可以无限嵌套。
### 示例二:理解并集、交集、补集的使用
筛选【年龄>13或视力≧4.6、且姓名含有‘小’、且年龄不高于15】的数据:
**查询**:`sheet[(mc.年龄>13) | (mc.视力>=4.6)][mc.姓名 == mf.re('小')][~(mc.年龄>15)].find( )`
**修改**:`sheet[(mc.年龄>13) | (mc.视力>=4.6)][mc.姓名 == mf.re('小')][~(mc.年龄>15)].update( {'年级':'初三'} )`
**删除**:`sheet[(mc.年龄>13) | (mc.视力>=4.6)][mc.姓名 == mf.re('小')][~(mc.年龄>15)].delete( )`
### 根据子元素过滤
可使用 mc.xxx.xxx.xxx... 的形式来表示子孙元素。
查询【语文成绩>80】的数据:
```python
sheet[mc.成绩.语文 > 80].find()
```
## 特殊字段名的表示方法
MongoDB 支持各种特殊的字段名,如:数字、符号、emoji 表情,这些字符在 Python 中不是合法变量名,因此使用 mc.1、mc.+ 等格式会报错,可用 mc['1']、mc['+']、mc['👈'] 这种格式代替。
## 切片
1、切片格式为 [start: stop: step] ,start 表示从哪条开始,stop 表示到哪条停止,step 表示步长。
2、start 和 stop
* 当为正值时,表示正序第 x 条,例如:1 表示第 1 条、2 表示第 2 条。
* 当为负值时,表示倒数第 x 条,例如:-1 表示倒数第 1 条、-2 表示倒数第 2 条。
* 不可为 0 。
3、step
* 须为正整数。
* 当 step >= 2 时表示间隔式切片。
* 当 step = 1 时可省略 `: step` ,即:[start: stop] 等价于 [start: stop: 1] 。
### 示例
```python
sheet[过滤器]...[过滤器][:].find() # 查询符合条件的全部数据
sheet[过滤器]...[过滤器][:].delete() # 删除符合条件的全部数据
sheet[过滤器]...[过滤器][:].update({'年级':'初一'}) # 修改符合条件的全部数据
sheet[过滤器]...[过滤器][1].find() # 查询符合条件的第1条
sheet[过滤器]...[过滤器][1].delete() # 删除符合条件的第1条
sheet[过滤器]...[过滤器][1].update({'年级':'初一'}) # 修改符合条件的第1条
sheet[过滤器]...[过滤器][3:7].find() # 查询符合条件的第3~7条
sheet[过滤器]...[过滤器][3:7].delete() # 删除符合条件的第3~7条
sheet[过滤器]...[过滤器][3:7].update({'年级':'初一'}) # 修改符合条件的第3~7条
sheet[过滤器]...[过滤器][3:7:2].find() # 查询符合条件的第3、5、7条
sheet[过滤器]...[过滤器][3:7:2].delete() # 删除符合条件的第3、5、7条
sheet[过滤器]...[过滤器][3:7:2].update({'年级':'初一'}) # 修改符合条件的第3、5、7条
```
值得注意的地方: [3: 8: 2] 操作第 3、5、7 条,而 [8: 3: 2] 操作第 8、6、4 条。
更多示例:
```python
[:] # 所有数据
[1:-1] # 所有数据
[-1:1] # 所有数据(逆序)
[1:] # 所有数据
[:1000] # 第1条 ~ 第1000条
[:-1000] # 第1条 ~ 倒数第1000条
[100:200] # 第100条 ~ 第200条
[200:100] # 第200条 ~ 第100条
[-300:-2] # 倒数第300条 ~ 倒数第2条
[50:-2] # 第50条 ~ 倒数第2条
[250:] # 第250条 ~ 最后1条
[-250:] # 倒数第250条 ~ 最后1条
[1] # 第1条
[-1] # 最后1条
[::3] # 以3为间距, 间隔操作所有数据
[100:200:4] # 以4为间距, 间隔操作第100条 ~ 第200条
```
## 字段提示
变量 mc 无字段提示功能,输入‘mc.’后,编辑器不会提示可选字段。
为了获得字段提示功能,可自建一个‘mc2’:
```python
class mc2(mc):
姓名 = 年龄 = 幸运数字 = None
class 成绩:
语文 = 数学 = None
sheet[mc.姓名 == '小王'][mc2.年龄 > 10].find()
sheet[mc.姓名 == '小王'][mc2.成绩.语文 > 80].find()
```
注:
1、mc2 与 mc 用法完全一致,可混用。
2、mc2 设置字段提示后,仅具备提示效果,而不产生任何实际约束。
## 排序
对所有年龄>12的数据,优先按年龄降序,其次按姓名升序,排序后返回第 2\~4 条数据:
```python
sheet[mc.年级=='高一'].order(年龄=False, 姓名=True)[2:4].find()
```
有趣的,以下两行代码的返回结果相同:
```python
sheet[mc.年级=='高一'].order(年龄=True)[1:-1].find()
sheet[mc.年级=='高一'].order(年龄=False)[-1:1].find()
```
解释:order(年龄=False) 表示按年龄降序,[-1:1]表示逆序切片,产生了类似‘负负得正’的效果。
注:
1、筛选器、切片器、排序器、限定字段器的位置可任意,位置不影响其效果。当然,它们都应该在 sheet 之后,且在 find/update/delete 之前。
2、可反复排序,find/update/delete 时是根据最后1次指定的顺序提取数据。以下代码最终是按年龄降序后提取数据:
```python
sheet.order(年龄=True, 姓名=False).order(年龄=False).find()
```
3、若想取消排序,则再次调用order方法,但不传入任何值。
```python
sheet.order(年龄=True, 姓名=False).order().find()
```
## 限定字段
只返回姓名、年龄这2个字段:
```python
sheet[mc.年级=='高一']['姓名','年龄'].find()
```
注:
1、限定字段只对 find 有作用,对 update/delete 无作用但不会报错。
2、筛选器、切片器、排序器、限定字段器的位置可任意,位置不影响其效果。当然,它们都应该在 sheet 之后,且在 find/update/delete 之前。
3、可反复限定字段,查询时是根据最后一次指定的字段提取数据。以下代码返回结果中只有‘年龄’字段:
```python
sheet[mc.年级=='高一']['姓名']['年龄'].find()
```
4、若想恢复提取全部字段,则限定字段为 `None` ,`None` 即代表“全部字段”。
```python
sheet[mc.年级=='高一']['姓名'][None].find()
```
## 统计 与 删库删表
| | 同步方式 | 异步方式 |
| ---------------------- | --------------------------- | ------------------------------------------------------ |
| 统计库的数量 | odm.len( ) | **await** odm.**a**len( ) |
| 统计表的数量 | db.len( ) | **await** db.**a**len( ) |
| 统计行的数量 | sheet.len( ) | **await** sheet.**a**len( ) |
| 统计符合条件的行的数量 | sheet[ mc.age > 8 ].len( ) | **await** sheet[ mc.age > 8 ].**a**len( ) |
| 获取库名清单 | odm.get_db_names( ) | **await** odm.**a**get_db_names( ) |
| 获取表名清单 | db.get_sheet_names( ) | **await** db.**a**get_sheet_names( ) |
| 删除某个库 | db.delete_db( ) | **await** db.**a**delete_db( ) |
| 删除某张表 | sheet.delete_sheet( ) | **await** sheet.**a**delete_sheet( ) |
## 迭代所有 库ODM 和 表ODM
```python
# 同步方式迭代
for db in odm:
for sheet in db:
print(sheet.sheet_name)
# 异步方式迭代
async for db in odm:
async for sheet in db:
print(sheet.sheet_name)
```
## 特殊操作
### 示例:自增
由于新年到了,令所有学生的年龄增加 1 岁:
```python
sheet.update( {'年龄': mo.inc( 1 )} )
```
### 特殊操作清单:
| **语法** | **含义** |
| --------------------- | -------------------------------------------------- |
| mo.inc( 1.5 ) | 自增 1.5 |
| mo.inc( -1.5 ) | 自减 1.5 |
| mo.add( 1, 2, 3 ) | 向列表字段添加元素,仅当被添加的元素不存在时才添加 |
| mo.push( 1, 2, 3 ) | 向列表字段添加元素,无论被添加的元素是否存在都添加 |
| mo.pull( 15 ) | 从列表字段删除 1 个等于 15 的值 |
| mo.popfirst | 从列表字段删除第 1 个元素 |
| mo.poplast | 从列表字段删除最后 1 个元素 |
| mo.rename( '新名称' ) | 重命名字段 |
| mo.unset | 删除字段 |
| mo.delete | 删除字段(与 mo.unset 等价) |
示例:
```python
sheet[mc.姓名=='小六'].update({
'姓名': 'xiaoliu', # 修改为‘xiaoliu’
'年龄': mo.inc(6), # 自增6
'幸运数字': mo.push(666), # 添加666
'视力': mo.rename('眼力'), # 字段名改为‘眼力’
'籍贯': mo.delete, # 删除此字段
'成绩.语文': 60, # 改为60分
'成绩.数学': mo.inc(-6) # 减6分
})
```
Raw data
{
"_id": null,
"home_page": null,
"name": "oomongo",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "mongodb, pymongo, motor, oomongo",
"author": null,
"author_email": "\u6c5f\u5357\u96e8\u4e0a <lcctoor@outlook.com>",
"download_url": "https://files.pythonhosted.org/packages/6f/ae/d1a359f43914cc76c0e3726551a96d6c32572efd979a0c722b9b50119d60/oomongo-1.1.2.tar.gz",
"platform": null,
"description": "# \u9879\u76ee\u63cf\u8ff0\n\n\u4e00\u4e2a\u975e\u5e38\u4f18\u96c5\u7684 MongoDB ODM \u3002\n\n# \u4f5c\u8005\n\n\u6c5f\u5357\u96e8\u4e0a\n\n[\u4e3b\u9875](https://lcctoor.com/index.html) \\| [Github](https://github.com/lcctoor) \\| [PyPi](https://pypi.org/user/lcctoor) \\| [\u5fae\u4fe1](https://lcctoor.com/cdn/WeChatQRC.jpg) \\| [\u90ae\u7bb1](mailto:lcctoor@outlook.com) \\| [\u6350\u8d60](https://lcctoor.com/cdn/DonationQRC-0rmb.jpg)\n\n# Bug\u63d0\u4ea4\u3001\u529f\u80fd\u63d0\u8bae\n\n\u4f60\u53ef\u4ee5\u901a\u8fc7 [Github-Issues](https://github.com/lcctoor/arts/issues)\u3001[\u5fae\u4fe1](https://lcctoor.com/cdn/WeChatQRC.jpg) \u4e0e\u6211\u8054\u7cfb\u3002\n\n# \u5b89\u88c5\n\n```\npip install oomongo\n```\n\n# \u6559\u7a0b\n\n\u672c\u6587\u5c06\u4ee5\u7b80\u6d01\u7684\u65b9\u5f0f\u5411\u4f60\u4ecb\u7ecd\u6838\u5fc3\u77e5\u8bc6\uff0c\u800c\u4e0d\u4f1a\u8ba9\u4f60\u88ab\u7e41\u7410\u7684\u672f\u8bed\u6240\u6df9\u6ca1\u3002\n\n## \u5bfc\u5165\n\n```python\nfrom pymongo import MongoClient\nfrom motor.motor_asyncio import AsyncIOMotorClient\nfrom oomongo import ODM, mc, mf, mo\n```\n\n## \u521b\u5efaODM\n\n```python\nclass ODM_2(ODM):\n\n def mkconn(self): # \u5b9a\u4e49\u540c\u6b65\u8fde\u63a5\u5668\n return MongoClient(host='localhost', port=27017)\n \n async def amkconn(self): # \u5b9a\u4e49\u5f02\u6b65\u8fde\u63a5\u5668\n return AsyncIOMotorClient(host='localhost', port=27017)\n\nodm = ODM_2() # \u8d26\u6237ODM\ndb = odm['\u6cc9\u5dde\u5e02'] # \u5e93ODM\nsheet = db['\u5e0c\u671b\u5c0f\u5b66'] # \u8868ODM\n```\n\n## \u57fa\u7840\u529f\u80fd \u2014\u2014 \u589e\u3001\u67e5\u3001\u6539\u3001\u5220\n\n\u3010\u589e\u3001\u67e5\u3001\u6539\u3001\u5220\u3011\u7684\u540c\u6b65\u65b9\u6cd5\u540d\u79f0\u5206\u522b\u4e3a\uff1ainsert\u3001find\u3001update\u3001delete \u3002\n\n\u5bf9\u5e94\u7684\u5f02\u6b65\u65b9\u6cd5\u540d\u79f0\u4e3a\u5404\u540c\u6b65\u65b9\u6cd5\u540d\u524d\u52a0 `a` \uff0c\u5373\uff1aainsert\u3001afind\u3001aupdate\u3001adelete \u3002\n\n### \u793a\u4f8b\n\n```python\nrow1 = {'\u59d3\u540d':'\u5c0f\u4e00', '\u5e74\u9f84':11, '\u5e78\u8fd0\u6570\u5b57':[1, 2, 3], '\u6210\u7ee9':{'\u8bed\u6587':81, '\u6570\u5b66':82}}\nrow2 = {'\u59d3\u540d':'\u5c0f\u4e8c', '\u5e74\u9f84':12, '\u5e78\u8fd0\u6570\u5b57':[2, 3, 4], '\u6210\u7ee9':{'\u8bed\u6587':82, '\u6570\u5b66':83}}\nrow3 = {'\u59d3\u540d':'\u5c0f\u4e09', '\u5e74\u9f84':13, '\u5e78\u8fd0\u6570\u5b57':[3, 4, 5], '\u6210\u7ee9':{'\u8bed\u6587':83, '\u6570\u5b66':84}}\nrow4 = {'\u59d3\u540d':'\u5c0f\u56db', '\u5e74\u9f84':14, '\u5e78\u8fd0\u6570\u5b57':[4, 5, 6], '\u6210\u7ee9':{'\u8bed\u6587':84, '\u6570\u5b66':85}}\nrow5 = {'\u59d3\u540d':'\u5c0f\u4e94', '\u5e74\u9f84':15, '\u5e78\u8fd0\u6570\u5b57':[5, 6, 7], '\u6210\u7ee9':{'\u8bed\u6587':85, '\u6570\u5b66':86}}\nrow6 = {'\u59d3\u540d':'\u5c0f\u516d', '\u5e74\u9f84':16, '\u5e78\u8fd0\u6570\u5b57':[6, 7, 8], '\u6210\u7ee9':{'\u8bed\u6587':86, '\u6570\u5b66':87}}\n```\n\n| | \u540c\u6b65\u65b9\u5f0f | \u5f02\u6b65\u65b9\u5f0f |\n| :---------: | ----------------------------- | -------------------------------------------------------- |\n| \u589e\uff081\u00a0\u6761\uff09 | sheet.insert( row1 ) | **await** sheet.**a**insert( row2 ) |\n| \u589e\uff08\u6279\u91cf\uff09 | sheet.insert( row3, row4 ) | **await** sheet.**a**insert( row5, row6 ) |\n| \u67e5 | sheet.find( ) | **await** sheet.**a**find( ) |\n| \u6539 | sheet.update( {'\u5e74\u9f84': 100} ) | **await** sheet.**a**update( {'\u5e74\u9f84': 200} ) |\n| \u5220 | sheet.delete( ) | **await** sheet.**a**delete( ) |\n\n### \u65b0\u589e\u65f6\uff0c\u67e5\u770b\u5206\u914d\u5230\u7684\u4e3b\u952e\uff1a\n\n```python\nrow1 = {'\u59d3\u540d':'\u5c0f\u4e00', '\u5e74\u9f84':11, '\u5e78\u8fd0\u6570\u5b57':[1, 2, 3], '\u6210\u7ee9':{'\u8bed\u6587':81, '\u6570\u5b66':82}}\nrow2 = {'\u59d3\u540d':'\u5c0f\u4e8c', '\u5e74\u9f84':12, '\u5e78\u8fd0\u6570\u5b57':[2, 3, 4], '\u6210\u7ee9':{'\u8bed\u6587':82, '\u6570\u5b66':83}}\nrow3 = {'\u59d3\u540d':'\u5c0f\u4e09', '\u5e74\u9f84':13, '\u5e78\u8fd0\u6570\u5b57':[3, 4, 5], '\u6210\u7ee9':{'\u8bed\u6587':83, '\u6570\u5b66':84}}\n\nr1 = sheet.insert( row1 )\nr2 = sheet.insert( row2, row3 )\n```\n\n\u65b9\u6cd51\uff1a\u4f7f\u7528 insert \u6dfb\u52a0\u6570\u636e\u6210\u529f\u540e\uff0crow1~row3 \u5df2\u5404\u81ea\u591a\u4e86\u4e00\u4e2a\u53eb\u2018_id\u2019\u7684\u952e\uff0c\u8be5\u952e\u7684\u503c\u5373\u5206\u914d\u5230\u7684\u4e3b\u952e\u3002\n\n\u65b9\u6cd52\uff1a\n\n```python\nr1.inserted_id\nr2.inserted_ids\n```\n\n## \u6ce8\uff1a\u4e0b\u6587\u4e2d\u6240\u6709\u793a\u4f8b\u90fd\u540c\u65f6\u652f\u6301\u540c\u6b65\u65b9\u5f0f\u548c\u5f02\u6b65\u65b9\u5f0f\uff0c\u5c06\u540c\u6b65\u793a\u4f8b\u4e2d\u7684 insert\u3001delete\u3001update\u3001find \u66ff\u6362\u4e3a ainsert\u3001adelete\u3001aupdate\u3001afind \u5373\u4e3a\u5f02\u6b65\u65b9\u5f0f\uff0c\u5f53\u7136\uff0c\u987b\u52a0\u4e0a await \u524d\u7f00\u3002\n\n## \u6761\u4ef6\u7b5b\u9009\n\n### \u793a\u4f8b\u4e00\uff1a\u7406\u89e3\u6761\u4ef6\u7b5b\u9009\u7684\u57fa\u672c\u8303\u5f0f\n\n\u7b5b\u9009\u3010\u5e74\u9f84>13\uff0c\u4e14\u89c6\u529b\u22674.6\uff0c\u4e14\u6027\u522b\u4e3a\u5973\u3011\u7684\u6570\u636e\uff0c\u5e76\u8fdb\u884c\u67e5\u6539\u5220\uff1a\n\n**\u67e5\u8be2**\uff1a`sheet[mc.\u5e74\u9f84 > 13][mc.\u89c6\u529b >= 4.6][mc.\u6027\u522b == '\u5973'].find( )`\n\n**\u4fee\u6539**\uff1a`sheet[mc.\u5e74\u9f84 > 13][mc.\u89c6\u529b >= 4.6][mc.\u6027\u522b == '\u5973'].update( {'\u5e74\u7ea7':'\u521d\u4e00', '\u7231\u597d':'\u753b\u753b,\u8df3\u7ef3'} )`\n\n**\u5220\u9664**\uff1a`sheet[mc.\u5e74\u9f84 > 13][mc.\u89c6\u529b >= 4.6][mc.\u6027\u522b == '\u5973'].delete( )`\n\n### \u7b5b\u9009\u64cd\u4f5c\u6e05\u5355\n\n| **\u4ee3\u7801** | \u89e3\u91ca |\n| ------------------------------------------------------------------------------ | ----------------------------------------------- |\n| mc.\u5e74\u9f84 > 10 | \u5927\u4e8e |\n| mc.\u5e74\u9f84 >= 10 | \u5927\u4e8e\u6216\u7b49\u4e8e |\n| mc.\u5e74\u9f84 < 10 | \u5c0f\u4e8e |\n| mc.\u5e74\u9f84 <= 10 | \u5c0f\u4e8e\u6216\u7b49\u4e8e |\n| mc.\u5e74\u9f84 == 10 | \u7b49\u4e8e |\n| mc.\u5e74\u9f84 != 10 | \u4e0d\u7b49\u4e8e |\n| mc.\u5e74\u7ea7 == mf.isin( '\u521d\u4e09', '\u9ad8\u4e8c' ) | \u82e5\u5b57\u6bb5\u503c\u662f\u4f20\u5165\u503c\u7684\u6210\u5458\uff0c\u5219\u7b26\u5408 |\n| mc.\u5e74\u9f84 == mf.notin( 10, 30, 45 ) | \u82e5\u5b57\u6bb5\u503c\u4e0d\u662f\u4f20\u5165\u503c\u7684\u6210\u5458\uff0c\u5219\u7b26\u5408 |\n| mc.\u7231\u597d == mf.contain_all( '\u753b\u753b', '\u8db3\u7403' ) | \u82e5\uff08\u5217\u8868\uff09\u5b57\u6bb5\u503c\u5305\u542b\u4f20\u5165\u503c\u7684\u6240\u6709\u5143\u7d20\uff0c\u5219\u7b26\u5408 |\n| mc.\u7231\u597d == mf.contain_any( '\u753b\u753b', '\u8db3\u7403' ) | \u82e5\uff08\u5217\u8868\uff09\u5b57\u6bb5\u503c\u5305\u542b\u4f20\u5165\u503c\u7684\u81f3\u5c111\u4e2a\u5143\u7d20\uff0c\u5219\u7b26\u5408 |\n| mc.\u7231\u597d == mf.contain_none( '\u753b\u753b', '\u8db3\u7403' ) | \u82e5\uff08\u5217\u8868\uff09\u5b57\u6bb5\u503c\u4e0d\u5305\u542b\u4f20\u5165\u503c\u7684\u4efb\u4f55\u5143\u7d20\uff0c\u5219\u7b26\u5408 |\n| mc.\u59d3\u540d == mf.re( '\u5c0f' ) | \u6b63\u5219\u5339\u914d |\n| \\[mc.\u5e74\u9f84 > 3\\][mc.\u5e74\u9f84 < 100] | \u4ea4\u96c6\uff08\u65b9\u5f0f\u4e00\uff09 |\n| [ (mc.\u5e74\u9f84 > 3) & (mc.\u5e74\u9f84 < 100) ] | \u4ea4\u96c6\uff08\u65b9\u5f0f\u4e8c\uff09 |\n| [(mc.\u5e74\u9f84<30)| (mc.\u5e74\u9f84>30) | (mc.\u5e74\u9f84==30)\u00a0| (mc.\u5e74\u9f84==None)] | \u5e76\u96c6 |\n| [ (mc.\u5e74\u9f84 > 3) - (mc.\u5e74\u9f84 > 100) ] | \u5dee\u96c6 |\n| [ ~(mc.\u5e74\u9f84 > 100) ] | \u8865\u96c6 |\n\n\u6ce8\uff1a\n\n1\u3001isin\u3001notin \u7528\u4e8e\u5224\u65ad\uff08\u666e\u901a\uff09\u5b57\u6bb5\u7684\u503c\u662f\u5426\u4f20\u5165\u503c\u7684\u6210\u5458\uff0c\u9488\u5bf9\u666e\u901a\u5b57\u6bb5\u3002\n\n2\u3001contain_any\u3001contain_none \u7528\u4e8e\u5224\u65ad\u4f20\u5165\u503c\u662f\u5426\uff08\u5217\u8868\uff09\u5b57\u6bb5\u7684\u503c\u7684\u6210\u5458\uff0c\u9488\u5bf9\u5217\u8868\u5b57\u6bb5\u3002\n\n3\u3001isin\u3001notin\u3001contain_all\u3001contain_any\u3001contain_none \u7684\u4f20\u5165\u503c\u90fd\u4e0d\u5fc5\u662f\u540c\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4ee5 isin \u4e3a\u4f8b\uff1a\u53ef\u4ee5\u8fd9\u6837\u4f7f\u7528\uff1amc.tag == mf.isin( 3, 3.5, '\u5b66\u751f', None )\uff0c\u4f20\u5165\u503c\u542b\u6709 int\u3001float\u3001str\u3001NoneType \u7b49\u591a\u79cd\u7c7b\u578b\u3002\n\n4\u3001\u6210\u5458\u8fd0\u7b97\u7b26\u672a\u4f20\u5165\u4efb\u4f55\u503c\u65f6\u7684\u5904\u7406\u65b9\u5f0f\uff1a\n\n| **\u4ee3\u7801** | **\u5904\u7406\u65b9\u5f0f** |\n| ----------------------------- | ------------------ |\n| mc.\u5e74\u7ea7 == mf.isin( ) | \u6240\u6709\u6570\u636e\u90fd \u4e0d\u7b26\u5408 |\n| mc.\u5e74\u7ea7 == mf.notin( ) | \u6240\u6709\u6570\u636e\u90fd \u7b26\u5408 |\n| mc.\u7231\u597d == mf.contain_all( ) | \u6240\u6709\u6570\u636e\u90fd \u7b26\u5408 |\n| mc.\u7231\u597d == mf.contain_any( ) | \u6240\u6709\u6570\u636e\u90fd \u4e0d\u7b26\u5408 |\n| mc.\u7231\u597d == mf.contain_none( ) | \u6240\u6709\u6570\u636e\u90fd \u7b26\u5408 |\n\n5\u3001\u56db\u79cd\u96c6\u5408\u8fd0\u7b97\u53ef\u4ee5\u76f8\u4e92\u5d4c\u5957\uff0c\u4e14\u53ef\u4ee5\u65e0\u9650\u5d4c\u5957\u3002\n\n### \u793a\u4f8b\u4e8c\uff1a\u7406\u89e3\u5e76\u96c6\u3001\u4ea4\u96c6\u3001\u8865\u96c6\u7684\u4f7f\u7528\n\n\u7b5b\u9009\u3010\u5e74\u9f84>13\u6216\u89c6\u529b\u22674.6\u3001\u4e14\u59d3\u540d\u542b\u6709\u2018\u5c0f\u2019\u3001\u4e14\u5e74\u9f84\u4e0d\u9ad8\u4e8e15\u3011\u7684\u6570\u636e\uff1a\n\n**\u67e5\u8be2**\uff1a`sheet[(mc.\u5e74\u9f84>13) | (mc.\u89c6\u529b>=4.6)][mc.\u59d3\u540d == mf.re('\u5c0f')][~(mc.\u5e74\u9f84>15)].find( )`\n\n**\u4fee\u6539**\uff1a`sheet[(mc.\u5e74\u9f84>13) | (mc.\u89c6\u529b>=4.6)][mc.\u59d3\u540d == mf.re('\u5c0f')][~(mc.\u5e74\u9f84>15)].update( {'\u5e74\u7ea7':'\u521d\u4e09'} )`\n\n**\u5220\u9664**\uff1a`sheet[(mc.\u5e74\u9f84>13) | (mc.\u89c6\u529b>=4.6)][mc.\u59d3\u540d == mf.re('\u5c0f')][~(mc.\u5e74\u9f84>15)].delete( )`\n\n### \u6839\u636e\u5b50\u5143\u7d20\u8fc7\u6ee4\n\n\u53ef\u4f7f\u7528 mc.xxx.xxx.xxx... \u7684\u5f62\u5f0f\u6765\u8868\u793a\u5b50\u5b59\u5143\u7d20\u3002\n\n\u67e5\u8be2\u3010\u8bed\u6587\u6210\u7ee9>80\u3011\u7684\u6570\u636e\uff1a\n\n```python\nsheet[mc.\u6210\u7ee9.\u8bed\u6587 > 80].find()\n```\n\n## \u7279\u6b8a\u5b57\u6bb5\u540d\u7684\u8868\u793a\u65b9\u6cd5\n\nMongoDB \u652f\u6301\u5404\u79cd\u7279\u6b8a\u7684\u5b57\u6bb5\u540d\uff0c\u5982\uff1a\u6570\u5b57\u3001\u7b26\u53f7\u3001emoji \u8868\u60c5\uff0c\u8fd9\u4e9b\u5b57\u7b26\u5728 Python \u4e2d\u4e0d\u662f\u5408\u6cd5\u53d8\u91cf\u540d\uff0c\u56e0\u6b64\u4f7f\u7528 mc.1\u3001mc.+ \u7b49\u683c\u5f0f\u4f1a\u62a5\u9519\uff0c\u53ef\u7528 mc['1']\u3001mc['+']\u3001mc['\ud83d\udc48'] \u8fd9\u79cd\u683c\u5f0f\u4ee3\u66ff\u3002\n\n## \u5207\u7247\n\n1\u3001\u5207\u7247\u683c\u5f0f\u4e3a [start: stop: step] \uff0cstart \u8868\u793a\u4ece\u54ea\u6761\u5f00\u59cb\uff0cstop \u8868\u793a\u5230\u54ea\u6761\u505c\u6b62\uff0cstep \u8868\u793a\u6b65\u957f\u3002\n\n2\u3001start \u548c stop\n\n* \u5f53\u4e3a\u6b63\u503c\u65f6\uff0c\u8868\u793a\u6b63\u5e8f\u7b2c x \u6761\uff0c\u4f8b\u5982\uff1a1 \u8868\u793a\u7b2c 1 \u6761\u30012 \u8868\u793a\u7b2c 2 \u6761\u3002\n* \u5f53\u4e3a\u8d1f\u503c\u65f6\uff0c\u8868\u793a\u5012\u6570\u7b2c x \u6761\uff0c\u4f8b\u5982\uff1a-1 \u8868\u793a\u5012\u6570\u7b2c 1 \u6761\u3001-2 \u8868\u793a\u5012\u6570\u7b2c 2 \u6761\u3002\n* \u4e0d\u53ef\u4e3a 0 \u3002\n\n3\u3001step\n\n* \u987b\u4e3a\u6b63\u6574\u6570\u3002\n* \u5f53 step >= 2 \u65f6\u8868\u793a\u95f4\u9694\u5f0f\u5207\u7247\u3002\n* \u5f53 step = 1 \u65f6\u53ef\u7701\u7565 `: step` \uff0c\u5373\uff1a[start: stop] \u7b49\u4ef7\u4e8e [start: stop: 1] \u3002\n\n### \u793a\u4f8b\n\n```python\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][:].find() # \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u5168\u90e8\u6570\u636e\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][:].delete() # \u5220\u9664\u7b26\u5408\u6761\u4ef6\u7684\u5168\u90e8\u6570\u636e\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][:].update({'\u5e74\u7ea7':'\u521d\u4e00'}) # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u5168\u90e8\u6570\u636e\n\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][1].find() # \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u7b2c1\u6761\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][1].delete() # \u5220\u9664\u7b26\u5408\u6761\u4ef6\u7684\u7b2c1\u6761\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][1].update({'\u5e74\u7ea7':'\u521d\u4e00'}) # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c1\u6761\n\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7].find() # \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3~7\u6761\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7].delete() # \u5220\u9664\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3~7\u6761\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7].update({'\u5e74\u7ea7':'\u521d\u4e00'}) # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3~7\u6761\n\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7:2].find() # \u67e5\u8be2\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3\u30015\u30017\u6761\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7:2].delete() # \u5220\u9664\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3\u30015\u30017\u6761\nsheet[\u8fc7\u6ee4\u5668]...[\u8fc7\u6ee4\u5668][3:7:2].update({'\u5e74\u7ea7':'\u521d\u4e00'}) # \u4fee\u6539\u7b26\u5408\u6761\u4ef6\u7684\u7b2c3\u30015\u30017\u6761\n```\n\n\u503c\u5f97\u6ce8\u610f\u7684\u5730\u65b9\uff1a [3: 8: 2] \u64cd\u4f5c\u7b2c 3\u30015\u30017 \u6761\uff0c\u800c [8: 3: 2] \u64cd\u4f5c\u7b2c 8\u30016\u30014 \u6761\u3002\n\n\u66f4\u591a\u793a\u4f8b\uff1a\n\n```python\n[:] # \u6240\u6709\u6570\u636e\n[1:-1] # \u6240\u6709\u6570\u636e\n[-1:1] # \u6240\u6709\u6570\u636e\uff08\u9006\u5e8f\uff09\n[1:] # \u6240\u6709\u6570\u636e\n[:1000] # \u7b2c1\u6761 ~ \u7b2c1000\u6761\n[:-1000] # \u7b2c1\u6761 ~ \u5012\u6570\u7b2c1000\u6761\n[100:200] # \u7b2c100\u6761 ~ \u7b2c200\u6761\n[200:100] # \u7b2c200\u6761 ~ \u7b2c100\u6761\n[-300:-2] # \u5012\u6570\u7b2c300\u6761 ~ \u5012\u6570\u7b2c2\u6761\n[50:-2] # \u7b2c50\u6761 ~ \u5012\u6570\u7b2c2\u6761\n[250:] # \u7b2c250\u6761 ~ \u6700\u540e1\u6761\n[-250:] # \u5012\u6570\u7b2c250\u6761 ~ \u6700\u540e1\u6761\n[1] # \u7b2c1\u6761\n[-1] # \u6700\u540e1\u6761\n[::3] # \u4ee53\u4e3a\u95f4\u8ddd, \u95f4\u9694\u64cd\u4f5c\u6240\u6709\u6570\u636e\n[100:200:4] # \u4ee54\u4e3a\u95f4\u8ddd, \u95f4\u9694\u64cd\u4f5c\u7b2c100\u6761 ~ \u7b2c200\u6761\n```\n\n## \u5b57\u6bb5\u63d0\u793a\n\n\u53d8\u91cf mc \u65e0\u5b57\u6bb5\u63d0\u793a\u529f\u80fd\uff0c\u8f93\u5165\u2018mc.\u2019\u540e\uff0c\u7f16\u8f91\u5668\u4e0d\u4f1a\u63d0\u793a\u53ef\u9009\u5b57\u6bb5\u3002\n\n\u4e3a\u4e86\u83b7\u5f97\u5b57\u6bb5\u63d0\u793a\u529f\u80fd\uff0c\u53ef\u81ea\u5efa\u4e00\u4e2a\u2018mc2\u2019\uff1a\n\n```python\nclass mc2(mc):\n \u59d3\u540d = \u5e74\u9f84 = \u5e78\u8fd0\u6570\u5b57 = None\n class \u6210\u7ee9:\n \u8bed\u6587 = \u6570\u5b66 = None\n\nsheet[mc.\u59d3\u540d == '\u5c0f\u738b'][mc2.\u5e74\u9f84 > 10].find()\nsheet[mc.\u59d3\u540d == '\u5c0f\u738b'][mc2.\u6210\u7ee9.\u8bed\u6587 > 80].find()\n```\n\n\u6ce8\uff1a\n\n1\u3001mc2 \u4e0e mc \u7528\u6cd5\u5b8c\u5168\u4e00\u81f4\uff0c\u53ef\u6df7\u7528\u3002\n\n2\u3001mc2 \u8bbe\u7f6e\u5b57\u6bb5\u63d0\u793a\u540e\uff0c\u4ec5\u5177\u5907\u63d0\u793a\u6548\u679c\uff0c\u800c\u4e0d\u4ea7\u751f\u4efb\u4f55\u5b9e\u9645\u7ea6\u675f\u3002\n\n## \u6392\u5e8f\n\n\u5bf9\u6240\u6709\u5e74\u9f84>12\u7684\u6570\u636e\uff0c\u4f18\u5148\u6309\u5e74\u9f84\u964d\u5e8f\uff0c\u5176\u6b21\u6309\u59d3\u540d\u5347\u5e8f\uff0c\u6392\u5e8f\u540e\u8fd4\u56de\u7b2c 2\\~4 \u6761\u6570\u636e\uff1a\n\n```python\nsheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00'].order(\u5e74\u9f84=False, \u59d3\u540d=True)[2:4].find()\n```\n\n\u6709\u8da3\u7684\uff0c\u4ee5\u4e0b\u4e24\u884c\u4ee3\u7801\u7684\u8fd4\u56de\u7ed3\u679c\u76f8\u540c\uff1a\n\n```python\nsheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00'].order(\u5e74\u9f84=True)[1:-1].find()\n\nsheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00'].order(\u5e74\u9f84=False)[-1:1].find()\n```\n\n\u89e3\u91ca\uff1aorder(\u5e74\u9f84=False) \u8868\u793a\u6309\u5e74\u9f84\u964d\u5e8f\uff0c[-1:1]\u8868\u793a\u9006\u5e8f\u5207\u7247\uff0c\u4ea7\u751f\u4e86\u7c7b\u4f3c\u2018\u8d1f\u8d1f\u5f97\u6b63\u2019\u7684\u6548\u679c\u3002\n\n\u6ce8\uff1a\n\n1\u3001\u7b5b\u9009\u5668\u3001\u5207\u7247\u5668\u3001\u6392\u5e8f\u5668\u3001\u9650\u5b9a\u5b57\u6bb5\u5668\u7684\u4f4d\u7f6e\u53ef\u4efb\u610f\uff0c\u4f4d\u7f6e\u4e0d\u5f71\u54cd\u5176\u6548\u679c\u3002\u5f53\u7136\uff0c\u5b83\u4eec\u90fd\u5e94\u8be5\u5728 sheet \u4e4b\u540e\uff0c\u4e14\u5728 find/update/delete \u4e4b\u524d\u3002\n\n2\u3001\u53ef\u53cd\u590d\u6392\u5e8f\uff0cfind/update/delete \u65f6\u662f\u6839\u636e\u6700\u540e1\u6b21\u6307\u5b9a\u7684\u987a\u5e8f\u63d0\u53d6\u6570\u636e\u3002\u4ee5\u4e0b\u4ee3\u7801\u6700\u7ec8\u662f\u6309\u5e74\u9f84\u964d\u5e8f\u540e\u63d0\u53d6\u6570\u636e\uff1a\n\n```python\nsheet.order(\u5e74\u9f84=True, \u59d3\u540d=False).order(\u5e74\u9f84=False).find()\n```\n\n3\u3001\u82e5\u60f3\u53d6\u6d88\u6392\u5e8f\uff0c\u5219\u518d\u6b21\u8c03\u7528order\u65b9\u6cd5\uff0c\u4f46\u4e0d\u4f20\u5165\u4efb\u4f55\u503c\u3002\n\n```python\nsheet.order(\u5e74\u9f84=True, \u59d3\u540d=False).order().find()\n```\n\n## \u9650\u5b9a\u5b57\u6bb5\n\n\u53ea\u8fd4\u56de\u59d3\u540d\u3001\u5e74\u9f84\u8fd92\u4e2a\u5b57\u6bb5\uff1a\n\n```python\nsheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00']['\u59d3\u540d','\u5e74\u9f84'].find()\n```\n\n\u6ce8\uff1a\n\n1\u3001\u9650\u5b9a\u5b57\u6bb5\u53ea\u5bf9 find \u6709\u4f5c\u7528\uff0c\u5bf9 update/delete \u65e0\u4f5c\u7528\u4f46\u4e0d\u4f1a\u62a5\u9519\u3002\n\n2\u3001\u7b5b\u9009\u5668\u3001\u5207\u7247\u5668\u3001\u6392\u5e8f\u5668\u3001\u9650\u5b9a\u5b57\u6bb5\u5668\u7684\u4f4d\u7f6e\u53ef\u4efb\u610f\uff0c\u4f4d\u7f6e\u4e0d\u5f71\u54cd\u5176\u6548\u679c\u3002\u5f53\u7136\uff0c\u5b83\u4eec\u90fd\u5e94\u8be5\u5728 sheet \u4e4b\u540e\uff0c\u4e14\u5728 find/update/delete \u4e4b\u524d\u3002\n\n3\u3001\u53ef\u53cd\u590d\u9650\u5b9a\u5b57\u6bb5\uff0c\u67e5\u8be2\u65f6\u662f\u6839\u636e\u6700\u540e\u4e00\u6b21\u6307\u5b9a\u7684\u5b57\u6bb5\u63d0\u53d6\u6570\u636e\u3002\u4ee5\u4e0b\u4ee3\u7801\u8fd4\u56de\u7ed3\u679c\u4e2d\u53ea\u6709\u2018\u5e74\u9f84\u2019\u5b57\u6bb5\uff1a\n\n```python\nsheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00']['\u59d3\u540d']['\u5e74\u9f84'].find()\n```\n\n4\u3001\u82e5\u60f3\u6062\u590d\u63d0\u53d6\u5168\u90e8\u5b57\u6bb5\uff0c\u5219\u9650\u5b9a\u5b57\u6bb5\u4e3a `None` \uff0c`None` \u5373\u4ee3\u8868\u201c\u5168\u90e8\u5b57\u6bb5\u201d\u3002\n\n```python\nsheet[mc.\u5e74\u7ea7=='\u9ad8\u4e00']['\u59d3\u540d'][None].find()\n```\n\n## \u7edf\u8ba1 \u4e0e \u5220\u5e93\u5220\u8868\n\n| | \u540c\u6b65\u65b9\u5f0f | \u5f02\u6b65\u65b9\u5f0f |\n| ---------------------- | --------------------------- | ------------------------------------------------------ |\n| \u7edf\u8ba1\u5e93\u7684\u6570\u91cf | odm.len( ) | **await** odm.**a**len( ) |\n| \u7edf\u8ba1\u8868\u7684\u6570\u91cf | db.len( ) | **await** db.**a**len( ) |\n| \u7edf\u8ba1\u884c\u7684\u6570\u91cf | sheet.len( ) | **await** sheet.**a**len( ) |\n| \u7edf\u8ba1\u7b26\u5408\u6761\u4ef6\u7684\u884c\u7684\u6570\u91cf | sheet[ mc.age > 8\u00a0].len( ) | **await** sheet[ mc.age > 8\u00a0].**a**len( ) |\n| \u83b7\u53d6\u5e93\u540d\u6e05\u5355 | odm.get_db_names( ) | **await** odm.**a**get_db_names( ) |\n| \u83b7\u53d6\u8868\u540d\u6e05\u5355 | db.get_sheet_names( ) | **await** db.**a**get_sheet_names( ) |\n| \u5220\u9664\u67d0\u4e2a\u5e93 | db.delete_db( ) | **await**\u00a0db.**a**delete_db( ) |\n| \u5220\u9664\u67d0\u5f20\u8868 | sheet.delete_sheet( ) | **await**\u00a0sheet.**a**delete_sheet( ) |\n\n## \u8fed\u4ee3\u6240\u6709 \u5e93ODM \u548c \u8868ODM\n\n```python\n# \u540c\u6b65\u65b9\u5f0f\u8fed\u4ee3\nfor db in odm:\n for sheet in db:\n print(sheet.sheet_name)\n\n# \u5f02\u6b65\u65b9\u5f0f\u8fed\u4ee3\nasync for db in odm:\n async for sheet in db:\n print(sheet.sheet_name)\n```\n\n## \u7279\u6b8a\u64cd\u4f5c\n\n### \u793a\u4f8b\uff1a\u81ea\u589e\n\n\u7531\u4e8e\u65b0\u5e74\u5230\u4e86\uff0c\u4ee4\u6240\u6709\u5b66\u751f\u7684\u5e74\u9f84\u589e\u52a0 1 \u5c81\uff1a\n\n```python\nsheet.update( {'\u5e74\u9f84': mo.inc( 1 )} )\n```\n\n### \u7279\u6b8a\u64cd\u4f5c\u6e05\u5355\uff1a\n\n| **\u8bed\u6cd5** | **\u542b\u4e49** |\n| --------------------- | -------------------------------------------------- |\n| mo.inc( 1.5 ) | \u81ea\u589e 1.5 |\n| mo.inc( -1.5 ) | \u81ea\u51cf 1.5 |\n| mo.add( 1, 2, 3 ) | \u5411\u5217\u8868\u5b57\u6bb5\u6dfb\u52a0\u5143\u7d20\uff0c\u4ec5\u5f53\u88ab\u6dfb\u52a0\u7684\u5143\u7d20\u4e0d\u5b58\u5728\u65f6\u624d\u6dfb\u52a0 |\n| mo.push( 1, 2, 3 ) | \u5411\u5217\u8868\u5b57\u6bb5\u6dfb\u52a0\u5143\u7d20\uff0c\u65e0\u8bba\u88ab\u6dfb\u52a0\u7684\u5143\u7d20\u662f\u5426\u5b58\u5728\u90fd\u6dfb\u52a0 |\n| mo.pull( 15 ) | \u4ece\u5217\u8868\u5b57\u6bb5\u5220\u9664 1 \u4e2a\u7b49\u4e8e 15 \u7684\u503c |\n| mo.popfirst | \u4ece\u5217\u8868\u5b57\u6bb5\u5220\u9664\u7b2c 1 \u4e2a\u5143\u7d20 |\n| mo.poplast | \u4ece\u5217\u8868\u5b57\u6bb5\u5220\u9664\u6700\u540e 1 \u4e2a\u5143\u7d20 |\n| mo.rename( '\u65b0\u540d\u79f0' ) | \u91cd\u547d\u540d\u5b57\u6bb5 |\n| mo.unset | \u5220\u9664\u5b57\u6bb5 |\n| mo.delete | \u5220\u9664\u5b57\u6bb5\uff08\u4e0e mo.unset \u7b49\u4ef7\uff09 |\n\n\u793a\u4f8b\uff1a\n\n```python\nsheet[mc.\u59d3\u540d=='\u5c0f\u516d'].update({\n '\u59d3\u540d': 'xiaoliu', # \u4fee\u6539\u4e3a\u2018xiaoliu\u2019\n '\u5e74\u9f84': mo.inc(6), # \u81ea\u589e6\n '\u5e78\u8fd0\u6570\u5b57': mo.push(666), # \u6dfb\u52a0666\n '\u89c6\u529b': mo.rename('\u773c\u529b'), # \u5b57\u6bb5\u540d\u6539\u4e3a\u2018\u773c\u529b\u2019\n '\u7c4d\u8d2f': mo.delete, # \u5220\u9664\u6b64\u5b57\u6bb5\n '\u6210\u7ee9.\u8bed\u6587': 60, # \u6539\u4e3a60\u5206\n '\u6210\u7ee9.\u6570\u5b66': mo.inc(-6) # \u51cf6\u5206\n})\n```\n",
"bugtrack_url": null,
"license": null,
"summary": "\u4e00\u4e2a\u975e\u5e38\u4f18\u96c5\u7684 MongoDB ODM",
"version": "1.1.2",
"project_urls": {
"Source": "https://github.com/lcctoor/arts/tree/main/arts/oomongo"
},
"split_keywords": [
"mongodb",
" pymongo",
" motor",
" oomongo"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "1cec7e079f47483ea46d5a7fc36ee57d8b239a97a62d4e12f96f6ddcd1e86a27",
"md5": "a4ba4ac5622fe1e202a2fd99d22f20ce",
"sha256": "85a6254ee1ec3358a57122a6c62a9f134e72292a6a270ce4b44e270d872a6c0c"
},
"downloads": -1,
"filename": "oomongo-1.1.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "a4ba4ac5622fe1e202a2fd99d22f20ce",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 10288,
"upload_time": "2024-07-28T23:46:51",
"upload_time_iso_8601": "2024-07-28T23:46:51.657922Z",
"url": "https://files.pythonhosted.org/packages/1c/ec/7e079f47483ea46d5a7fc36ee57d8b239a97a62d4e12f96f6ddcd1e86a27/oomongo-1.1.2-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6faed1a359f43914cc76c0e3726551a96d6c32572efd979a0c722b9b50119d60",
"md5": "5d2c94f00dbb9d50db5c38609b66f87e",
"sha256": "6968829983ffe2b141dabd4038a7b0718aa814a92feb3d2a25cb73ad59ea94a5"
},
"downloads": -1,
"filename": "oomongo-1.1.2.tar.gz",
"has_sig": false,
"md5_digest": "5d2c94f00dbb9d50db5c38609b66f87e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 24450,
"upload_time": "2024-07-28T23:46:53",
"upload_time_iso_8601": "2024-07-28T23:46:53.783970Z",
"url": "https://files.pythonhosted.org/packages/6f/ae/d1a359f43914cc76c0e3726551a96d6c32572efd979a0c722b9b50119d60/oomongo-1.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-28 23:46:53",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "lcctoor",
"github_project": "arts",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "oomongo"
}