Python操作MongoDB
1.连接MongoDB# 导入Python操作MongoDB的驱动pymongoimport pymongofrom pymongo import MongoClient# MongoClient返回一人MongoDB的连接对象client = MongoClient(host='localhost', port=27017)# 也可以用MongoDB的URI方式连接client = MongoClient("mongodb://localhost:27017/")
2.指定数据库
# 查看MongoDB中有哪些数据库client.list_database_names()
['admin', 'blogs_db', 'config', 'hrm', 'local']
# 指定数据库, 以属性风格方式指定数据库db = client.hrm# 也可以以字典访问风格的方式指定数据库db = client['hrm']
3.指定集合
# 查看指定的数据库下面有哪些集合db.list_collection_names()
['department', 'employee', 'roles']
# 指定到特定的某个集合, 使用类属性访问风格coll = db.roles# 也可以使用类字典访问风格coll = db['roles']
4.插入数据4.1.插入单条数据
emp = { 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position':'BSM', 'income': 20000, 'email':'josen.zhang@163.com', 'mobile':'13777777777', 'status':'active', 'interests':['Fishing','Bike','Chess'], 'department':{ 'name':'软件开发项目部', 'supervisor':'Arturo Filo' }, 'location':{ 'address':'闵行区商务区7号楼', 'city':'上海市', 'province':'上海市' }}# 插入单条数据db.employee.insert_one(emp)
<pymongo.results.InsertOneResult at 0x7fbeb0526dc0>
emp1 = { 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position':'Senior Software Architect', 'income': 22000, 'email':'ekrn.dong@163.com', 'mobile':'13677777777', 'status':'active', 'interests':['News','Car','Tour'], 'department':{ 'name':'.NET软件开发项目部', 'supervisor':'Jacobo Hou' }, 'location':{ 'address':'国家科技园5期', 'city':'无锡市', 'province':'江苏省' }}emp2 = { 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position':'Senior Front Architect', 'income': 18000, 'email':'lemon.yang@163.com', 'mobile':'13577777778', 'status':'active', 'interests':['Painting','Photograph','Tour'], 'department':{ 'name':'前端开发部', 'supervisor':'James Chen' }, 'location':{ 'address':'新加坡工业园区3期', 'city':'苏州市', 'province':'江苏省' }}# 插入多条数据db.employee.insert_many([emp1, emp2])
<pymongo.results.InsertManyResult at 0x7fbeb040ed20>
查询返回单个结果(dict或None)
# 无条件查询,返回一个结果文档result = db.employee.find_one()result
{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}
# 有条件查询,返回一个结果文档result = db.employee.find_one({'name':'Lemon Yang'})result
{'_id': ObjectId('5f28e4a99d46f5d35e29c45b'), 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position': 'Senior Front Architect', 'income': 18000, 'email': 'lemon.yang@163.com', 'mobile': '13577777778', 'status': 'active', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '前端开发部', 'supervisor': 'James Chen'}, 'location': {'address': '新加坡工业园区3期', 'city': '苏州市', 'province': '江苏省'}}
查询返回多个结果(cursor类型,可迭代)
# 无条件查询,返回所有文档results = db.employee.find()# 遍历结果for result in results: print(result)
{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}{'_id': ObjectId('5f28e4a99d46f5d35e29c45b'), 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position': 'Senior Front Architect', 'income': 18000, 'email': 'lemon.yang@163.com', 'mobile': '13577777778', 'status': 'active', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '前端开发部', 'supervisor': 'James Chen'}, 'location': {'address': '新加坡工业园区3期', 'city': '苏州市', 'province': '江苏省'}}
# 有条件查询,返回多个满足条件的文档results = db.employee.find({'gender':'男'})# 遍历文档for result in results: print(result)
{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}
5.3.比较运算符
比较运算符
# 查询工资小于20K的员工for emp in db.employee.find({'income':{'$lt': 20000}}): print(emp)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45b'), 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position': 'Senior Front Architect', 'income': 18000, 'email': 'lemon.yang@163.com', 'mobile': '13577777778', 'status': 'active', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '前端开发部', 'supervisor': 'James Chen'}, 'location': {'address': '新加坡工业园区3期', 'city': '苏州市', 'province': '江苏省'}}
# 查询年龄为32或37的员工for emp in db.employee.find({'age':{'$in': [32,37]}}): print(emp)
{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}
5.4.功能符号
功能符号
# $regex查询name以J开头的文档for doc in db.employee.find({'name':{'$regex':'^J.*'}}): print(doc)
{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}
# 插入一个文档,和之前的文档相比,这个文档少了一个name_cn属性,状态为inactiveemp3 = { 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position':'Database Engineer', 'income': 12000, 'email':'katina.yang@163.com', 'mobile':'13976667778', 'status':'inactive', 'interests':['Painting','Photograph','Tour'], 'department':{ 'name':'数据研发部', 'supervisor':'Bob Brown' }, 'location':{ 'address':'新加坡工业园区4期', 'city':'苏州市', 'province':'江苏省' }}# 插入数据db.employee.insert_one(emp3)
<pymongo.results.InsertOneResult at 0x7fbeb064beb0>
# 查询namce_cn属性不存在的文档for doc in db.employee.find({'name_cn':{'$exists':False}}): print(doc)
{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position': 'Database Engineer', 'income': 12000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}
# 年龄模4取0的文档for doc in db.employee.find({'age':{'$mod':[4,0]}}): print(doc)
{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}
# 使用前必须创建文本索引db.employee.create_index([('name', pymongo.TEXT)])# 查询text类型的属性中包含Json的文档for doc in db.employee.find({'$text':{'$search':'Josen'}}): print(doc)
{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}
# 使用$where实现高级查询# 单条件查询, 这里的this表示逐条判断for doc in db.employee.find({'$where':'this.age<30'}): print(doc)
{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position': 'Database Engineer', 'income': 12000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}
# 使用$where实现高级查询# 多条件过滤for doc in db.employee.find({'$and':[ {'$where':'this.age>32'}, {'$where':'this.age<38'}]}): print(doc)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}
# $and查询for doc in db.employee.find({ '$and': [ {'age': {'$gt': 30}}, {'status':'active'}, {'income':{'$lt':20000}} ]}): print(doc)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45b'), 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position': 'Senior Front Architect', 'income': 18000, 'email': 'lemon.yang@163.com', 'mobile': '13577777778', 'status': 'active', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '前端开发部', 'supervisor': 'James Chen'}, 'location': {'address': '新加坡工业园区3期', 'city': '苏州市', 'province': '江苏省'}}
# $or查询for doc in db.employee.find({ '$or':[ {'income': {'$gt': 20000}}, {'status':'inactive'} ]}): print(doc)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position': 'Database Engineer', 'income': 12000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}
# $and与$or查询for doc in db.employee.find({ '$and':[ {'$or':[{'income':{'$gt':20000}}, {'income':{'$lt': 15000}}]}, {'$or':[{'status':'inactive'},{'age':{'$gt': 35}}]} ]}): print(doc)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position': 'Database Engineer', 'income': 12000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}
6.查询文档个数或查询结果计数
# 查询employee集合中有多少个文档db.employee.estimated_document_count()
4
# 查询employee集合中文档的个数,也可以使用count_documents, 但是{}不能省略db.employee.count_documents({})
4
# 有条件查询, 查询集合employee中性别为'男'的文档数目db.employee.count_documents({'gender':'男'})
2
# 单列升序for doc in db.employee.find().sort('name', pymongo.ASCENDING): print(doc)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position': 'Database Engineer', 'income': 12000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}{'_id': ObjectId('5f28e4a99d46f5d35e29c45b'), 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position': 'Senior Front Architect', 'income': 18000, 'email': 'lemon.yang@163.com', 'mobile': '13577777778', 'status': 'active', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '前端开发部', 'supervisor': 'James Chen'}, 'location': {'address': '新加坡工业园区3期', 'city': '苏州市', 'province': '江苏省'}}
7.2.单列降序
# 单列降序for doc in db.employee.find().sort('name', pymongo.DESCENDING): print(doc)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45b'), 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position': 'Senior Front Architect', 'income': 18000, 'email': 'lemon.yang@163.com', 'mobile': '13577777778', 'status': 'active', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '前端开发部', 'supervisor': 'James Chen'}, 'location': {'address': '新加坡工业园区3期', 'city': '苏州市', 'province': '江苏省'}}{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position': 'Database Engineer', 'income': 12000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}
7.3.多列排序
# 例如先按照gender升序,再按照工资降序for doc in db.employee.find().sort([ ('gender', pymongo.ASCENDING), ('income', pymongo.DESCENDING)]): print(doc)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45b'), 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position': 'Senior Front Architect', 'income': 18000, 'email': 'lemon.yang@163.com', 'mobile': '13577777778', 'status': 'active', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '前端开发部', 'supervisor': 'James Chen'}, 'location': {'address': '新加坡工业园区3期', 'city': '苏州市', 'province': '江苏省'}}{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position': 'Database Engineer', 'income': 12000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22000, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}
8.偏移
偏移用来对结果集进行过滤,方法skip(num)。比如说skip(2), 表示结果集跳过前两条记录,从第三条开始。
注: 在数据量非常大时,最好不要用skip()来查询数据,可能会导致内存溢出。
# 结果集偏移两个文档,从第三个文档开始 for doc in db.employee.find().skip(2): print(doc)
{'_id': ObjectId('5f28e4a99d46f5d35e29c45b'), 'name': 'Lemon Yang', 'name_cn': '杨丽会', 'gender': '女', 'age': 31, 'position': 'Senior Front Architect', 'income': 18000, 'email': 'lemon.yang@163.com', 'mobile': '13577777778', 'status': 'active', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '前端开发部', 'supervisor': 'James Chen'}, 'location': {'address': '新加坡工业园区3期', 'city': '苏州市', 'province': '江苏省'}}{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 21, 'position': 'Database Engineer', 'income': 12000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}
9.限制结果集limit
limit(n)用来限制结果集显示文档的数
for doc in db.employee.find().limit(1): print(doc)
{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20000, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}
10.更新数据10.1.更新单条数据db.collection.update_one(): 修改单条文档,返回结果是UpdateResult类型
针对UpdateResult类型的数据,可以调用matched_count和modified_count属性分别获取匹配的条数和影响的条数
result = db.employee.update_one( {'name':'Katina Yang'}, { '$inc': {'age': 1}, '$set': {'income': 13000} })print(result)print(result.matched_count, result.modified_count)
<pymongo.results.UpdateResult object at 0x7fbeb01ece10>1 1
db.employee.find_one({'name':'Katina Yang'})
{'_id': ObjectId('5f28f5629d46f5d35e29c45c'), 'name': 'Katina Yang', 'gender': '女', 'age': 22, 'position': 'Database Engineer', 'income': 13000, 'email': 'katina.yang@163.com', 'mobile': '13976667778', 'status': 'inactive', 'interests': ['Painting', 'Photograph', 'Tour'], 'department': {'name': '数据研发部', 'supervisor': 'Bob Brown'}, 'location': {'address': '新加坡工业园区4期', 'city': '苏州市', 'province': '江苏省'}}
result = db.employee.update_many( {'gender':'男'}, { '$inc': {'age': 3}, '$inc': {'income': 500} })print(result)print(result.matched_count, result.modified_count)for doc in db.employee.find({'gender':'男'}): print(doc)
<pymongo.results.UpdateResult object at 0x7fbeb00c66e0>2 2{'_id': ObjectId('5f28e2449d46f5d35e29c459'), 'name': 'Josen Zhang', 'name_cn': '张军', 'gender': '男', 'age': 32, 'position': 'BSM', 'income': 20500, 'email': 'josen.zhang@163.com', 'mobile': '13777777777', 'status': 'active', 'interests': ['Fishing', 'Bike', 'Chess'], 'department': {'name': '软件开发项目部', 'supervisor': 'Arturo Filo'}, 'location': {'address': '闵行区商务区7号楼', 'city': '上海市', 'province': '上海市'}}{'_id': ObjectId('5f28e4a99d46f5d35e29c45a'), 'name': 'Ekrn Dong', 'name_cn': '董大鹏', 'gender': '男', 'age': 37, 'position': 'Senior Software Architect', 'income': 22500, 'email': 'ekrn.dong@163.com', 'mobile': '13677777777', 'status': 'active', 'interests': ['News', 'Car', 'Tour'], 'department': {'name': '.NET软件开发项目部', 'supervisor': 'Jacobo Hou'}, 'location': {'address': '国家科技园5期', 'city': '无锡市', 'province': '江苏省'}}
11.删除数据db.collection.remove(): 删除指定条件的所有数据
result = db.employee.remove({'status':'inactive'})print(result)
{'n': 1, 'ok': 1.0}
db.collection.delete_one(): 删除第一条符合条件的数据,返回DeleteResult类型数据
result = db.employee.delete_one({'gender':'男'})print(result)print(result.deleted_count)
<pymongo.results.DeleteResult object at 0x7fbeb038d140>1
db.collection.delete_many(): 删除所有符合条件的数据,返回DeleteResult类型数据
db.employee.delete_many({'status':'active'})print(result)print(result.deleted_count)
<pymongo.results.DeleteResult object at 0x7fbeb038d140>1
for doc in db.employee.find(): print(doc)
除了提供上面这些方法外,pymongo还提供了更多的方法,如find_one_and_delete()、fine_one_and_replace()、和find_one_and_update(), 当然,还有操作索引的方法: create_index()、create_indexes()、drop_index()等方法。