首先导入:

from pymongo import MongoClient

连接mongodb:

没有密码的连接方式
mongo_client = MongoClient(mongo_host, mongo_port, connect=False)
有密码的认证登录方式:
self.client = pymongo.MongoClient(host="127.0.0.1", port=27017, username="user name", password="pass/word")

连接数据库:例如连接my_db数据库,没有则自动创建

mongo_db = mongo_client["my_db"]
# 或者下面这样也可以
mongo_db = mongo_client.my_db

使用集合:例如使用my_set集合,没有则自动创建

coll = mongo_db["my_set"]
# 或者下面这样也可以
coll = mongo_db.my_set

接下来是集合里面的操作

1、基本操作

​(1)查找

parmas = {"age": 16, "address": "beijing"}
if params is None:cursors = coll.find()
else:cursors = coll.find(params)

find()内不传参时是查找的整个集合的数据,也可以通过字典传参精确查找,精确查找出来的可能没有,可能是一个,也可能是多个,无论一个还是多个,都是列表生成器对象,需要按照列表的操作方法取出来(也可以使用list方法强转列表)。

for cursor in cursors:
通过循环每一条数据进行操作
也可以按列表索引取值

条件查找操作符

符号 含义 示例 示例含义
$lt 小于 {‘age’: {’$lt’: 20}} 年龄小于20
$gt 大于 {‘age’: {’$gt’: 20}} 年龄大于20
$lte 小于等于 {‘age’: {’$lte’: 20}} 年龄小于等于20
$gte 大于等于 {‘age’: {’$gte’: 20}} 年龄大于等于20
$ne 不等于 {‘age’: {’$ne’: 20}} 年龄不等于20
$in 在范围内 {‘age’: {’$in’: [20, 23]}} 年龄在20到30的范围内
$nin 不在范围内 {‘age’: {’$nin’: [20, 23]}} 年龄不在20到30的范围内
$or 或条件 {"$or":[{“age”:30},{“address”: “nanjing”}]} 年龄30岁或者地址是nangjing的
$and 且条件 and基本不用,因为相当于find()内传字典时,传入多对键值对而已,例{“name”: “laowang”, “age”: 40}

查找集合中年龄大于15小于20的所有数据

cursors = coll.find({"age": {"$gt": 15, "$lt": 20}})

功能符号归类如下:

符号 含义 示例 示例含义
$regex 匹配正则 {‘name’: {’$regex’: ‘^M.*’}} name以M开头
$exists 属性是否存在 {‘name’: {’$exists’: True}} name属性存在
$type 类型判断 {‘age’: {’$type’: ‘int’}} age的类型为int
$mod 数字模操作 {‘age’: {’$mod’: [5, 0]}} 年龄模5余0
$text 文本查询 {"$text": {"$search’: ‘Mike’}} text类型的属性中包含Mike字符串
$where 高级条件查询 {’$where’: ‘obj.fans_count == obj.follows_count’} 自身粉丝数等于关注数
正则匹配name字段以M开头的数据

例如查询名字以M开头的学生数据,示例如下:
result = coll.find({“name”: {"$regex": “^M.*”}})

查找某个字段是某种类型的
#找出name的类型是String的

cursors = coll.find({"name": {'$type': 2}})

#类型 值
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已废弃
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127

find_one: 查找一条数据,用法和find相同,但是结果返回的是这条数据的字典结构

对查找出来的数据进行排序

使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序,-1为降序。

这里升序的1也可以使用pymongo.ASCENDING,降序的-1也可以使用pymongo.DESCENDING

cursors = coll.find().sort([("age", 1), ("student_id", -1)])
cursors = coll.find().sort([("age", pymongo.ASCENDING), ("student_id", pymongo.DESCENDING)])

偏移:某些情况下,我们想取查询出来的数据中忽略掉前几个,可以使用skip()

偏移

cursors = coll.find().skip(2)

注:在数据量非常庞大的时候,如千万、亿级,最好不要使用大的偏移量来查询数据,很可能会导致内存溢出,可以使用类似
cursors = coll.find({"_id": {"$gt": ObjectId(“5c6a52868b8c3c6f24ea5edb”)}})
这样的方法来查询,记录好上次查询的_id

限制数据条数:某些情况下我们只想取查出来的前几个,可以使用limit()

值得注意的是,在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,很可能会导致内存溢出,可以使用类似find({’_id’: {’$gt’: ObjectId(‘593278c815c2602678bb2b8d’)}}) 这样的方法来查询,记录好上次查询的_id

只取前10条数据

cursors = coll.find().limit(10)

计数统计

nums = coll.find().count()

以上方法可以组合使用

(2) 插入数据

​insert、insert_one、insert_many

insert: 可以插入一条数据,也可以插入多条数据,拥有insert_one和insert_many的功能,但是官方在python3的版本中已经不推荐使用了,推荐使用后两个,当然仍然使用也没问题,insert在插入一条数据的时候,会返回插入数据的_id,插入多条时候,会返回一个_id列表。
result = coll.insert({“name”: “laowang”, “age”: 40}) # 结果会返回插入数据的_id
result = coll.insert([{“name”: “laowang”, “age”: 40}, {“name”: “lisi”, “age”: 41}, {“name”: “wangwu”, “age”: 42}])

结果返回一个列表,里面包含插入所有数据的_id

insert_one: 插入一条数据,和insert插入一条数据用法相同,只不过返回的结果是个InsertOneResult对象,我们可以调用inserted_id属性获取_id。

insert_many: 插入多条数据,和insert插入多条数据用法相同,只不过返回的结果是个InsertOneResult对象,我们可以调用inserted_ids属性获取_id列表

(3)更新

update()、update_one()、update_many() 更新时如无此字段,则会添加
update() 同insert一样,它兼具了后两个的功能,也是官方已经不推荐使用了,推荐使用后两个
这里讲下update_one和update_many的使用吧
update_one(): 此方法只匹配查出来的第一条数据去进行更新

把laowang的年龄改为42,address改为nanjing

condition = {"name": "laowang"}
update = {"$set": {"age": 42, "address": "nanjing"}}
result = coll.update(filter=condition, update=update)

返回的结果是UpdateResult类型,调用match_count和modified_count属性分别可以获得匹配的数据条数和影响的数据条数

高级一点的用法:

把老王的年龄加1

condition = {"name": "laowang"}
update = {"$inc": {"age": 1}}
result = coll.update(filter=condition, update=update)

​update_many(): 使用同update_one(), 但是它会更新所有匹配出来的数据

(4)删除

remove: 使用比较简单,调用时会把符合条件的所有数据全部删除,同insert一样,也有两个新的推荐使用方法,delete_one和delete_many

remove会删除所有匹配到的数据,返回结果是执行结果状态和执行的条数

result = coll.remove({"age": 20})

delete_one:只删除匹配的第一条数据,返回结果是DeleteResult对象,可以调用deleted_count属性获取删除数据的条数

result = coll.delete_one({"age": 20})

delete_many:只删除匹配的第一条数据,返回结果是DeleteResult对象,可以调用deleted_count属性获取删除数据的条数

result = coll.delete_many({"age": 20})

(5)distinct
查找某个字段有多少种类

查找数据表中,所有人中,一共有多少个省份的人,假如50人,有20个省份的人,则查询后返回的是一个列表,列表中包含所有的省份,但不重复

result = coll.distinct("address")

2 高级用法

(1)高级查找: aggregate

query_param = {}
match_params = {"$match": query_param}
group = {"_id": {},"total_integral": {"$sum": "$integral"},}
group_params = {"$group": group}
sort = {"_id.student_id": pymongo.ASCENDING,"_id.age": pymongo.ASCENDING
}
sort_params = {"$sort": sort}
result = coll.aggregate([match_params, group_params, sort_params])

(2)高级操作
bulk_write
待完成

3 加索引

为字段创建索引, 其中的1和-1分别表示正序与负序排列,创建唯一索引,不加unique=True的话默认是普通的索引,即unique=False
create_index 和 ensure_index,用法相同,ensure_index在pymongo3.0已弃用,推荐使用create_index
key_list = [(“索引字段名1”, 1), (“索引字段名2”, 1), (“索引字段名3”, 1),]
coll.create_index(key_list, unique=True)
使用create_index或则ensure_index创建与之前“唯一性unique”不同的同名索引,会出现“OperationFailure”错误。
解决方法:
首先,判断有无同名索引;然后判断同名索引是否为唯一索引;
若有同名索引,且非唯一索引,则删除已有的同名索引,然后重新建立索引。

from pymongo import MongoClientdef create_unique_index():"""创建唯一索引:return:"""coll = MongoClient('localhost').get_database('test_db').get_collection('test_col_1')all_index = coll.index_information()printall_index  # 打印所有索引信息has_id_index = all_index.get("id_1", False)  # 判断有无“id”索引if has_id_index:if all_index['id_1'].get('unique', False):  # id为唯一索引passelse:coll.drop_index([("id", 1)])coll.create_index([("id", 1)], unique=True)  # 尝试创建唯一索引else:coll.create_index([("id", 1)], unique=True)  # 尝试创建唯一索引if __name__ == "__main__":create_unique_index()

未完,待续。。。。。。。。

官方文档:https://pymongo.readthedocs.io/en/3.10.0/#getting-help

pymongo使用教程相关推荐

  1. PyMongo 官方教程

    Prerequisites import pymongo Making a Connection with MongoClient >>> from pymongo import M ...

  2. pymongo 使用教程

    前言 4个多月之前,写过一篇关于非关系型数据库mongodb的博文,介绍了怎么在Windows系统下来操作mongodb的细节.基础不太牢固的可以点击下面的链接http://blog.csdn.net ...

  3. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  4. 【python教程入门学习】Python零基础入门爬虫项目

    Python入门爬虫项目 这是我的第一个python项目,分享给大家. 需求 我们目前正在开发一款产品其功能大致是:用户收到短信如:购买了电影票或者火车票机票之类的事件.然后app读取短信,解析短信, ...

  5. Mongodb python驱动教程

    2019独角兽企业重金招聘Python工程师标准>>> Mongodb python驱动教程 安装 使用python驱动mongodb需要下载.安装PyMongo包 Windows用 ...

  6. python处理数据的包_在Python中利用Into包整洁地进行数据迁移的教程

    动机 我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组.数据库或者二进制存储等高效的计算格式.更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工 ...

  7. python常用模块教程_盘点Python常用的模块和包

    模块 1.定义 计算机在开发过程中,代码越写越多,也就越难以维护,所以为了编写可维护的代码,我们会把函数进行分组,放在不同的文件里.在python里,一个.py文件就是一个模块. 2.优点: 提高代码 ...

  8. 爬虫教程( 2 ) --- 爬虫框架 Scrapy、Scrapy 实战

    From:https://piaosanlang.gitbooks.io/spiders/content/ scrapy-cookbook :https://scrapy-cookbook.readt ...

  9. MongoDb随笔,PyMongo简单使用

    安装MongoDb [更新2021-07-06] https://www.mongodb.com/try/download/community 下载对应系统的软件版本(CentOS7.9 mongod ...

最新文章

  1. UML用例图概要(转)
  2. “23岁本科生发14篇SCI”,文章被学校官网悄悄删了,你怎么看?
  3. python详细安装教程linux-Linux下python3.7.0安装教程
  4. python基础学习笔记(十三)
  5. 汽车穿越沙漠的算法问题(反推法)
  6. 常见Java面试题 程序中如何决定使用 HashMap 还是 TreeMap?
  7. JAVA获取项目工程下的文件
  8. qq远程控制电脑方法_【技术分享】教你远程控制别人电脑
  9. Linux pwn入门教程,i春秋linux_pwn入门教程复现之栈溢出基础
  10. 耶鲁 计算机科学,耶鲁大学计算机科学专业排名第20(2020年USNEWS美国排名)
  11. 解决Golang程序运行时占用内存不断增加的问题
  12. django orm与scrapy集成:
  13. 保密安全风险自评估单机版检查工具V1.5
  14. java代码生成UUID以及在线UUID生成器
  15. python读取shp文件,
  16. scratch编程——一个列表实现经典扫雷游戏
  17. DirectX、Directshow介绍
  18. 如何在EverEdit编辑器中一键编译运行JAVA并接收键盘输入数据
  19. ThreadPoolExecutor(四)——Interrupt
  20. MATLAB De_Pcode Mex 求助

热门文章

  1. .net core生成PDF文件,iTextSharp使用
  2. java web ppt_javawebppt演讲
  3. 计算机网络的软硬件组成,314 计算机网络的硬件与软件组成.ppt
  4. linux下添加中文包,LINUX下中文语言包的安装
  5. 2022-2028年中国酒吧行业投资潜力研究及发展趋势预测报告
  6. 银行卡类型api,通过银行卡查询判断卡类型
  7. JavaScript初见
  8. Linux系统移植——Linux下USB存储设备操作
  9. 硬盘检测工具 HD Tune Pro
  10. 变频器输出侧增加输出滤波器