ekrn(ekrnexe)

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>


4.2.插入多条数据

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>


5.查询数据5.1.db.collection.find_one()

查询返回单个结果(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': '江苏省'}}


5.2.db.collection.find()

查询返回多个结果(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


7.排序调用sort()方法,传入要排序的字段,可以是多个字段也可以是单个字段排序的方式使用pymongo.ASCENDING(升序)或pymong.DESCENDING(降序)7.1.单列升序

# 单列升序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': '江苏省'}}


10.2.更新多条数据db.collection.update_many(): 修改多条文档,返回结果是UpdateResult类型


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>1db.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()等方法。