[toc]
常用方法 表格
使用 | 语法 |
---|---|
连接 | pymongo.MongoClient(host, port, safe=False) |
创建数据库、创建集合 | client.db_name/client[dbname]、db[clc_name] |
向集合中插入文档(数据) | insert_one(dict) 、insert_many(list_of_dict) |
查找、遍历数据 | clc.find_one(filter)、clc.find(filter) |
对文档中字段基础操作【增、改、删】 | update_one(filter, update) / update_many(filter, update) |
删除文档 | delete_one(filter)、delete_many(filter) |
关闭连接 | client.close() |
update | 说明 |
---|---|
filter参数 | {key: value} 用于定位到目标文档 |
update参数 | {command: {key: value}} |
连接 MongoClient(host, port, safe)
import pymongo
host = 'localhost'
port = 27017
client = pymongo.MongoClient(host=host, port=port)
语法:
pymongo.MongoClient(host, port, safe=False)
safe:会降低效率【True】主要是有个16Mb的限制——-果然是一句自己才能听懂的话
创建数据库、集合
连接 / 创建数据库
client['one_db'] / client.one_db
db = client['firet_db'] ## 或者 db = client.first_db
如果数据库存在,那么进行连接;如果不存在,那么创建并连接 【两种方法等价】
连接 / 创建集合
-
db[collection_name]
collection = db['lmao']
## collection = db[collection_name]
- 如果集合存在,那么进行连接;如果不存在,那么创建并连接
向集合中插入文件(数据)
插入一个
-
insert_one(dict)
## collection.insert_one(file_dict) one = { '_id': 9999999, 'name': '马大师', 'sex': '男的', '技能': ['闪电五连鞭', '态急?', '还有?'] } result = collection.insert_one(one) print(result, result.inserted_id)
参数说明:
file_dict
- 字典型。值可以为数、字符串、列表等
_id
- 顾名思义,每个文件唯一标识(不可与其它文件重复)。一般没有特殊需要不用设置这个,它会自动生成[比较保险]
result.inserted_id
- 返回插入文件的 _id 值
执行上述代码,控制台输出如下:
<pymongo.results.InsertOneResult object at 0x0000027973926140> 9999999
再看一下数据库:
插入多个
-
insert_many(list_of_dict)
语法 |
---|
collection.insert_many(list_of_dict) |
- 传入参数为一个列表,列表元素为单个字典文件。
这里用一下**Faker**,创造一些假人假信息。【自己瞎编太费劲】 |
from faker import Faker
fk = Faker('zh_CN') #语言为中文
fakers = [] ## 创建一个列表保存一些假人的信息
for i in range(10):
one = {
'_id': fk.ssn(),
'name': fk.name(),
'sex': fk.profile()['sex'],
'phone_number': fk.phone_number(),
'住址': fk.address(),
'job': fk.job(),
'company': fk.company(),
'webs': [fk.profile()['website'] for i in range(3)]
}
fakers.append(one)
## 插入并获得返回状态
result = collection.insert_many(fakers)
print(result, result.inserted_ids, sep='\n')
控制台输出:
<pymongo.results.InsertManyResult object at 0x000001DABA7ECD00>
['640205199907040266', '341282199012223195', '43010519800309991X',
'610401198202267335', '542500197903223632', '430811196007023433',
'210323194004012657', '370612199205232407', '441203199006013077', '420704195106119785']
数据库:
查询与遍历
查询一个
-
collection.find_one(filter)
filter
: 可以理解为筛查条件- 该语句返回符合条件的一个字典对象
## collection.find_one(filter)
filter = {'name': '马大师'}
result = collection.find_one(filter)
print(result)
控制台输出:
【方便看调整了一下换行】
{
'_id': 9999999,
'name': '马大师',
'sex': '男的',
'技能': ['闪电五连鞭', '态急?', '还有?']
}
查询多个 (遍历)
-
collection.find(filter)
- 返回符合条件的所有字典文件
filter = {'sex': 'F'}
result = collection.find(filter)
print(result)
## 遍历
for one in result:
print(one)
控制台输出:
<pymongo.cursor.Cursor object at 0x000001769CAEC8E0>
{'_id': '421024198601109957', 'name': '刘秀梅', 'sex': 'F', 'phone_number': '18861104808', '住址': '云南省拉萨县清浦哈尔滨街j座 847623', 'job': 'Flash设计/开发', 'company': '超艺信息有限公司', 'webs': [['https://leiyan.net/', 'http://liao.cn/', 'https://tanli.cn/', 'https://www.lin.cn/'], ['http://lu.cn/'], ['http://jun.cn/', 'http://www.lei.cn/', 'https://www.11.cn/']]}
{'_id': '370212195601208505', 'name': '邹丹丹', 'sex': 'F', 'phone_number': '13931880402', '住址': '贵州省深圳市璧山天津街R座 965470', 'job': '项目经理', 'company': '太极网络有限公司', 'webs': [['https://yongliang.cn/', 'http://li.cn/'], ['http://www.ed.cn/', 'https://www.juanfang.net/', 'https://www.yb.cn/'], ['http://www.huwang.cn/', 'https://xiulanxiulan.cn/', 'http://hou.cn/']]}
{'_id': '341702196811193932', 'name': '李文', 'sex': 'F', 'phone_number': '14511823214', '住址': '澳门特别行政区玉兰市上街潘街j座 909220', 'job': '面料辅料采购', 'company': '凌云网络有限公司', 'webs': [['https://www.qiang.org/', 'http://ej.cn/'], ['http://juanyang.cn/', 'https://leiye.cn/', 'https://www.md.cn/', 'https://www.ganghuang.cn/'], ['https://www.ma.net/']]}
{'_id': '440705195208163752', 'name': '王兵', 'sex': 'F', 'phone_number': '15772203979', '住址': '河北省超市吉区耿街h座 131212', 'job': '快递员', 'company': '良诺科技有限公司', 'webs': [['https://www.yonglei.cn/', 'https://tanxiao.cn/', 'https://www.lei.net/'], ['http://leicai.cn/', 'http://www.fang.cn/', 'http://98.cn/'], ['https://www.yangmin.cn/', 'https://69.org/', 'https://minxiulan.cn/']]}
高级查询
比较运算符
符号 | 说明 |
---|---|
$eq | 它将匹配等于指定值的值。 |
$ne | 它将匹配所有不等于指定值的值 |
$gt | 它将匹配大于指定值的值。 |
$gte | 它将匹配所有大于或等于指定值的值 |
$lt | 它将匹配所有小于指定值的值 |
$lte | 它将匹配所有小于或等于指定值的值 |
$in | 它将匹配数组中指定的任何值 |
$nin | 它讲匹配不再数组中的值 |
filter = {
'fid': {'$eq': 1011},
'value': {'$ne': 2}
}
filter2 = {
'name': {'$in': ['Fry', 'Bender']}
}
filter3 = {
'price': {'$lt': 200, '$gt': 100}
}
逻辑运算符
符号 | 说明 |
---|---|
$and | 它将查询语句与逻辑连接起来, AND返回同时符合这两个条件的所有文档。 |
$not | 它将反转查询的结果, 并返回与查询表达式不匹配的文档。 |
$nor | 它将使用逻辑将查询子句连接起来, NOR返回所有与子句不匹配的文档。 |
$or | 它将使用逻辑将查询子句连接起来, OR返回匹配任一子句条件的所有文档。 |
filter = {
'$and':[
{'fid': {'$eq': 2048}},## filter_01
{'sid': {'$ne': 1024}} ## filter_02
]
}
filter1 = {
'$or':[
{'fid': {'$eq': 2048}},## filter_01
{'sid': {'$ne': 1024}} ## filter_02
]
}
正则表达式
filter = {
'name': {'$regex': r'Tom [a-zA-Z]+'}
}
遍历集合内所有文件:
- 获取集合内所有文件:
## collection.find({})
for one in collection.find({}):
print(one)
删除文档(文件)
删除一个
-
collection.delete_one(filter)
删除多个
-
collection.delete_many(filter)
filter = {'name': '小美'}
collection.delete_one(filter)
filter = {'sex': 'F'}
collection.delete_many(filter)
更新文档【增、改、删】
- 针对文档中的字段而言。
- 或者说是针对键值对而言的更新。
更新一个
-
collection.update_one(filter, update)
更新多个
-
collection.update_many(filter, update)
- 新参量
update
说明:
形式{command: {key: value}}
command(命令) | 功能 |
---|---|
$set | 修改或新增字段 |
$unset | 删除指定字段 |
$rename | 重命名字段 |
$set 命令
- 如果
key
存在,那么更改其值为value
- 如果
key
不存在,那么插入{key: value}
字段
于是:filter = {'name': '马大师'} add_data = {'age': 60} ## key name 存在,改其值为 马大师? update = {'$set': {'name': '马大师?'}} ## key age 不存在,插入字段 update1 = {'$set': add_data} collection.update_one(filter, update1) collection.update_one(filter, update)
$unset 命令
-
filter
用于定位到文档 - 删除文档中的整个
{key: value}
字段
filter = {'name': '马大师?'}
del_data = {'age': 60}
update1 = {'$unset': del_data}
collection.update_one(filter, update1)
于是 age字段不在了:
$rename 命令
-
{'$rename': {'initile_name': 'new_name'}
【意会意会】 - 此处
key(initial_name)
为文档中的某一key
(比如:name、sex) -
value(new_name)
为想要修改为的key值 - 意思就是,执行语句后,
initial_name
换为new_name
filter = {'name': '马大师?'}
update = {'$rename': {'name': '名字'}}
collection.update_one(filter, update)
- 于是可以看到,数据库中name变成了名字
运行前:
运行后:
断开连接【关闭数据库】
-
client.close()
client.close()