pymongo 简单使用
PyMongo 的简单使用:
pymongo是Python中用来操作MongoDB的一个库。
- 官方文档:http://api.mongodb.com/python/current/tutorial.html
一、安装python包:
-
进入python环境,输入命令:
pip install pymongo
-
源码安装:
python setup.py
二、连接数据库:
-
引入包pymongo:
import pymongo
-
连接到服务器,创建客户端:
// 明确指定主机和端口,进行连接 client = pymongo.MongoClient('localhost' , 27017) // 也可以指定参数,进行连接 client = pymongo.MongoClient(host='localhost', port=27017)
//或使用MongoDB URL格式进行连接 client = pymongo.MongoClient('mongodb://localhost:27017/') // 若Mongo数据库有用户名、密码时的连接 client = pymongo.MongoClient('mongodb://root:[email protected]:27017/databaseName') // 设置用户名、密码、以及连接到哪个数据中的格式: uri = 'mongodb://' + user + ':' + pwd + '@' + server + ':' + port +'/'+ db_name // 举个栗子: 注意验证账号密码的时候,必须指定到admin的数据库 client = pymongo.MongoClient('mongodb://root:[email protected]:27017/admin')
-
获得数据库:
-
MongoDB中一个实例能够支持多个独立的数据库,
用点取属性的方式来获取数据库,或者通过字典的方式获取
。// 使用点取属性的方式获取数据库 db = Client.course_database // 通过字典的方式获取数据库 db = Client['course_database']
course_database是数据库的名字,随意起
-
-
获取集合:
-
也是支持
用点取属性的方式来获取数据库,或者通过字典的方式获取
。// 点属性方式获取集合 collection = db.course_database // 通过字段的方式获取集合 collection = db['course_database']
-
三、数据库的增删改查操作:
1.新增文档:
-
新增一条文档:
db.集合名.insert_one({"key": "value"})
db.course.insert_one({"name": "上海财经大学", "price": 998})
// 到终端进行查找, 可以看到刚刚插入的数据 > db.course.find(); { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 998, "name" : "上海财经大学" }
-
新增多条文档:
db.集合名.insert_many([{"key": "value"}, {"key": "value"}])
db.course.insert_many( [ {"name": "北京交通大学", "price": 1688}, {"name": "清华大学", "price": 1888} ] )
// 到终端进行查找, 可以看到刚刚批量插入的数据 > db.course.find(); { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 998, "name" : "上海财经大学" } { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" } { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
2.查询文档:
-
查询一条文档:
db.集合名.find_one()
data = db.course.find_one() print data {u'price': 998, u'_id': ObjectId('5ca07a75d04ac33bb0697237'), "name" : "上海财经大学"} // 查询一条数据时, 返回的是一个字典
-
查询一条文档时,增加过滤条件:
db.集合名.find_one({"查询条件"})
// 查询一条数据,并且课程价钱是1688元的 data = db.course.find_one({"price": 1688}) print data { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" } // 获取是一个字典
-
查询多条文档:
db.集合名.find()
data = db.course.find() print data <pymongo.cursor.Cursor object at 0x0000000003F71550> // 查询多条数据时, 返回的是一个游标对象, 通过遍历游标获取所有数据 for item in data: print item // 获取到所有数据 { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 998, "name" : "上海财经大学" } { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" } { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
-
查询多条文档时,增加过滤条件:
db.集合名.find({"查询条件"})
// 查询所有课程价格时998元的 data = db.course.find({"price": 998}) print data <pymongo.cursor.Cursor object at 0x000000000418C588> // 返回的是一个游标对象 // 查看返回的数据,需要遍历游标对象 for item in data: print item { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 998, "name" : "上海财经大学" }
-
通过ObjectId的字符串进行查询:
from bson.objectid import ObjectId // 先将字符串转换成对象 data = db.course.find_one({'_id': ObjectId('5ca07b91d04ac325ec77ab66')}) print data //查询结果 { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
-
查询运算符 in:
db.集合名.find({"查询字段": {"$in": ["值1", "值2"]}})
// 首先看一下接下来要举例子中用到的数据 > db.course.find().pretty() { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" } { "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"), "课程专业" : [ "土木工程", "计算机", "建筑学" ], "price" : 666, "name" : "上海财经大学" } { "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"), "课程专业" : [ "古建筑", "软件工程" ], "price" : 888, "name" : "哈尔滨工业大学" }
// 查询课程价格是666元或1888元 data = db.course.find({"price": {"$in": [666, 1888]}}) for item in data: print item // 查询结果 { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" } { "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"), "课程专业" : [ "土木工程", "计算机", "建筑学" ], "price" : 666, "name" : "上海财经大学" }
-
查询运算符AND:
db.集合名.find({"字段名":"值","字段名": {'$gt':"值1"}})
// 查询课程名为"上海财经大学"并且课程价格大于500元,都有哪些课程 data = db.course.find({"name":"上海财经大学", "price": {"$gt": 500}}) print data for item in data: print item // 查询结果 { "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"), "课程专业" : [ "土木工程", "计算机", "建筑学" ], "price" : 666, "name" : "上海财经大学" }
-
查询运算符 or:
db.集合名.find({"or": [{"字段名":"值"},{"字段名1":"值1"}]})
// 查询课程名为"哈尔滨工业大学`或者课程价格大于1000元的课程 data = db.course.find({"$or": [{"name": "哈尔滨工业大学"}, {"price": {"$gt": 1000}}]}) for item in data: print item // 查询结果: { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" } { "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"), "课程专业" : [ "古建筑", "软件工程" ], "price" : 888, "name" : "哈尔滨工业大学" }
-
查询整个数组(数组内容必须全部存在):
db.集合名.find({"字段":["值","值1","值2"]})
// 查询课程专业是"土木工程", "计算机", "建筑学"的课程是哪些 data = db.course.find({"课程专业": ["土木工程", "计算机", "建筑学"]}) for item in data: print item // 查询结果 { "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"), "课程专业" : [ "土木工程", "计算机", "建筑学" ], "price" : 666, "name" : "上海财经大学" }
-
查询整个数组(数组内容只需包含):
db.集合名.find({"字段:{"$all":["值1", "值2"]})
// 查询课程专业包含"计算机"或"土木工程"的都有哪些课程 data = db.course.find({'课程专业': {"$all": ['计算机', '土木工程']}}) for item in data: print item // 查询结果 { "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"), "课程专业" : [ "土木工程", "计算机", "建筑学" ], "price" : 666, "name" : "上海财经大学" }
-
查询数组某个元素:
db.集合名.find("字段名":"数组中的值")
// 查询课程专业名是"古建筑"的课程都有哪些 data = db.course.find({"课程专业": "古建筑"}) for item in data: print item // 查询结果 { "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"), "课程专业" : [ "古建筑", "软件工程" ], "price" : 888, "name" : "哈尔滨工业大学" }
-
通过数组索引查询元素:
db.集合名.find({"字段名.索引": "数组内索引所对应的值"})
// 查询课程专业第一个名为"土木工程"都有哪些课程 data = db.course.find({"课程专业.0": "土木工程"}) for item in data: print item // 查询结果: // 查询结果 { "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"), "课程专业" : [ "土木工程", "计算机", "建筑学" ], "price" : 666, "name" : "上海财经大学" }
-
查询字段存在的元素exists:
db.集合名.find({"字段名":{"$exists":False| True}})
// 查询有课程名的课程都有哪些 data = db.course.find({"name": {"$exists": True}}) for item in data: print item // 查询结果: { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" } { "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"), "课程专业" : [ "土木工程", "计算机", "建筑学" ], "price" : 666, "name" : "上海财经大学" } { "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"), "课程专业" : [ "古建筑", "软件工程" ], "price" : 888, "name" : "哈尔滨工业大学" }
3.修改文档:
-
修改一条文档:
db.集合名.update_one(filter={"查询条件"}, update= {"$set": {"修改目标"})
// 查询上海财经大学,将该课程的价格更改成999元 data = db.course.update_one(filter={"name": "上海财经大学"}, update={"$set": {"price": 999}}) print data // <pymongo.results.UpdateResult object at 0x0000000004156C18>返回结果是一个对象 // 可以看到上海财经大学课程价格更改成999元 > db.course.find() { "_id" : ObjectId("5ca07a75d04ac33bb0697237"), "price" : 999, "name" : "上海财经大学" } { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" } { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
-
修改多条文档:
db.集合名.update_many(filter={"查询条件"}, update={"$set":{"修改目标"}})
修改的字段存在就更新字段对应的值,若不存在就创建新的字段
// 将课程价格大于100元的课程,添加字段desc,并且创建对应的值名 data = db.course.update_many({'price': {"$gt": 100}}, {"$set": {"desc": "最好的考研平台!"}}) // 查询结果: 可以看出来课程以前没有desc字段,使用批量更新的时候创建了desc的字段 > db.course.find().pretty() { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学", "desc" : "最好的考研平台!" } { "_id" : ObjectId("5ca0903dd04ac32bc01ade3d"), "课程专业" : [ "土木工程", "计算机", "建筑学" ], "price" : 666, "name" : "上海财经大学", "desc" : "最好的考研平台!" } { "_id" : ObjectId("5ca0903dd04ac32bc01ade3e"), "课程专业" : [ "古建筑", "软件工程" ], "price" : 888, "name" : "哈尔滨工业大学", "desc" : "最好的考研平台!" }
4.删除文档:
-
删除一条文档:
db.集合名.delete_one({})
data = db.course.delete_one({}) // 条件写的是什么, 只删除一条数据 print data <pymongo.results.DeleteResult object at 0x0000000003EF3CA8> // 返回结果是一个对象 // 可以看到将上海财经大学的文档已经删除 > db.course.find() { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" } { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
-
删除多条文档:
db.集合名.delete_many({"过滤条件"})
// 删除文档时注意过滤条件, 否则将集合中所有文档都删除 // 删除课程价格为1688的文档 data = db.course.delete_many({"price": 1688}) print data // <pymongo.results.DeleteResult object at 0x0000000003DB1CA8>返回结果是一个对象
// 删除前,该集合中的数据 > db.course.find() { "_id" : ObjectId("5ca07b91d04ac325ec77ab65"), "price" : 1688, "name" : "北京交通大学" } { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" } { "_id" : ObjectId("5ca082d938bffb822439b7f3"), "name" : "哈尔滨工业大学", "price" : 1688 } // 删除后, 该集合中的数据 > db.course.find() // 该课程中有两门课程时1688元, 所以删除多条文档后,只剩下了一条文档 { "_id" : ObjectId("5ca07b91d04ac325ec77ab66"), "price" : 1888, "name" : "清华大学" }
四、运算符列表:
名称 | 描述 |
---|---|
$or |
逻辑或 |
$eq |
等于 |
$gt |
大于 |
$gte |
大于等于 |
$in |
在数组中 |
$lt |
小于 |
$lte |
小于等于 |
$ne |
不等于 |
$nin |
不在数组中 |
$elemMatch |
数组元素满足 |
$all |
数组包含元素 |
$slice |
数组切片 |
$type |
字段值类型检查 |
$exists |
字段是否存在判断 |
$set |
更新字段的值 |
$currentDate |
设定某字段的值为当前日期时间 |
$inc |
增加某字段的值 |
$push |
为数组字段添加新的元素 |