[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_dbdb = 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()