Python中MongoDB的使用



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

文章作者: pxoxq
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 pxoxq !
  目录