PyMongo 的简单使用:

一、安装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:123456@localhost:27017/databaseName')
// 设置用户名、密码、以及连接到哪个数据中的格式:
uri = 'mongodb://' + user + ':' + pwd + '@' + server + ':' + port +'/'+ db_name
// 举个栗子: 注意验证账号密码的时候,必须指定到admin的数据库
client = pymongo.MongoClient('mongodb://root:123456@localhost: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" : "清华大学" }
  • 查询运算符 indb.集合名.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" : "上海财经大学"
}
  • 查询运算符ANDdb.集合名.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" : "上海财经大学"
}
  • 查询运算符 ordb.集合名.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" : "上海财经大学"
}
  • 查询字段存在的元素existsdb.集合名.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

为数组字段添加新的元素