python mongodb驱动 pymongo模块常见用法总结

目录

  • 前言
  • import
  • 连接到数据库
  • 创建数据库/集合
  • 插入数据
  • 查询数据
    • 单条查询
    • 多条查询
    • 只查某些字段
    • 复杂(复合)对象查询
  • 更新数据
  • 删除数据

前言

上一篇:MongoDB初次体验 下载安装与配置

mongodb是好用的非关系型数据库,可以以json对象的形式存储数据,这在web应用中有非常好的特性,且拥有良好的可拓展性。所以今天来总结一下如何用python的pymongo模块驱动mongodb,实现常见的增删查改操作。

pymongo所有操作都是同步的,等待结果时程序会阻塞。值得一提的是,mongodb速度要比mysql快很多。。。

import

通过

import pymongo

引入驱动模块。如果未安装,那么需要用pip进行安装,下面给出使用pip安装到对应的python版本

python -m pip install pymongo

如果是linux,那么别忘了加上sudo,全局安装

sudo python -m pip install pymongo

连接到数据库

使用pymongo.MongoClient连接到数据库,并且获取数据库对象,其中参数是mongodb的地址

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')

值得注意的是,整个mongoclient就是一个巨大的map(或者说dict ?),可以通过索引来找到不同的数据库与集合。下面给出mongoclient及其数据库与集合的架构

mongocilent
数据库1
数据库2
集合1
集合2

我们可以通过

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]	# 连接到数据库
col = db["testCollection"]	# 获取集合

来连接到test数据库的testCollection集合,并且获取集合对象col

创建数据库/集合

在mongodb中,无需特定的语句创建数据库。往指定的数据库与集合里面插入数据,如果数据库或集合不存在,那么将会被自动创建,这是好的。这意味着我们可以省略一些判断。

值得注意的是,必须插入至少一条语句,数据库与集合的创建才能生效。

运行如下代码在test数据库中新建testCollection的集合,并且插入一条数据

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

col.insert_one({"name": "TensorLee", "number": 114514})

起 效 了 在mongodb的控制台可以查看代码执行的结果
python mongodb驱动 pymongo模块常见用法总结_第1张图片

插入数据

在集合中插入数据,我们先要获取集合对象。这里我们沿用上文的,获取test数据库的testCollection集合

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

因为python中也有dict数据类型,类似json对象的表示方法,我们可以通过insert_one方法,直接插入一个dict对象来表示插入的记录。

col.insert_one({"name": "student0", "number": 4396})

我们也可以通过insert_many方法来插入许多对象,其中参数是一个list,里面每个元素是要插入的对象(dict)

col.insert_many(list)

下面的代码演示了两种插入方法:

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

col.insert_one({"name": "student0", "number": 4396})

list = [
    {
        "name": "student1",
        "number": 10001
    },
    {
        "name": "student2",
        "number": 10002
    },
    {
        "name": "student3",
        "number": 10003
    }
]

col.insert_many(list)

值得注意的是,这两个函数是有返回值的。返回插入文档的_id字段(即mongodb的自带主键)

  1. insert_one 函数的返回值是一个对象,其 inserted_id 属性是插入文档的_id
  2. insert_many 函数的返回值是一个对象,其 inserted_ids(比上面多个s) 属性是插入文档的_id的数组(list)

除此之外,返回的对象可以通过强制类型转换,转换为字符串。即id_str = str(id)。下面的代码演示了如何获取返回值并且把它变成字符串(字符串数组)

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

ret = col.insert_one({"name": "student0", "number": 4396})
print('insert_one函数返回: ', str(ret.inserted_id))

list = [
    {
        "name": "student1",
        "number": 10001
    },
    {
        "name": "student2",
        "number": 10002
    },
    {
        "name": "student3",
        "number": 10003
    }
]

ret = col.insert_many(list)
retlist = []
for id in ret.inserted_ids:
    retlist.append(str(id))
print('insert_many函数返回: ', retlist)

输出
在这里插入图片描述
mongodb查询代码执行结果
在这里插入图片描述

查询数据

我们知道在mongodb的console中,通过find函数传入条件对象的方式,可以指定查找的条件,比如
在这里插入图片描述
在pymongo中,也是同样,传入条件对象(dict)即可快速查询。这里使用find_one来返回单个查询结果

单条查询

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

found = col.find_one({"number": 10001})
notfound = col.find_one({"number": 114514})

print(found)
print(notfound)

值得注意的是,如果存在,那么返回该对象(在python中表示为dict),如果不存在,返回None。结果如下:
在这里插入图片描述

多条查询

如果使用find而不是find_one,那么会返回全部符合的记录

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

ret = col.find()
for i in ret:
    print(i)

python mongodb驱动 pymongo模块常见用法总结_第2张图片

只查某些字段

有时候我们没有必要获取整个记录的对象,而只用获取对象的某一属性,如果查询的是整个对象,那么浪费带宽。

find函数的第二个参数是字段条件筛选对象,可以指定返回那些字段。比如我们只要number字段。

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

where = {
    "name": "student0"
}

need = {
    "_id": 0,
    "number": 1
}

ret = col.find_one(where, need)
print(ret)

值得注意的是,除了 _id属性,其他属性,只要未出现在need中,默认不选择。上述代码给出示例:除了number,其他都不要

在这里插入图片描述

当然也可以反选,即"number": 0,那么未出现的属性,就默认选了。以下代码给出示例:除了name,其他都要

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

where = {
    "name": "student0"
}
value = {
    "name": 0,
}
ret = col.find_one(where, value)
print(ret)

在这里插入图片描述

复杂(复合)对象查询

在实际生产中,往往会存储复杂对象,比如对象的属性是另一个对象

obj = {
    "name": "TensorLee",
    "bodyState": {
        "bloodType": "AB",
        "shape": {
            "height": "123cm",
            "weight": "456kg"
        }
    }
}

这时候我们可以在条件指定中,通过 父对象.子对象的方式来定位到要查找的字段。

比如我们要查找上述对象的 bodyState属性中的shape属性的height属性,我们就传bodyState.shape.height即可

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

where = {
    "bodyState.shape.height": "123cm"
}

ret = col.find_one(where)

print(ret)

在这里插入图片描述

更新数据

和查询数据类似,我们指定where对象,即那些记录要被更新,然后指定value对象,即更新那些字段。值得注意的是,value对象的指定,和我们使用mongodb的JavaScript运行时控制台一样,需要指定$set 或 $inc 等指令

以下的代码将namestudent0的第一条记录的number字段改为7777

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

where = {
    "name": "student0"
}
value = {
    "$set": {
        "number": 7777
    }
}
col.update_one(where, value)

检查运行结果
python mongodb驱动 pymongo模块常见用法总结_第3张图片
指定 $inc 指令可以让数据字段自增(或者自减),以下的value对象指定了number字段增加10

value = {
    "$inc": {
        "number": 10
    }
}

检查代码运行结果
python mongodb驱动 pymongo模块常见用法总结_第4张图片
如果使用 update 那么将更新所有匹配的记录,而不是只更新第一条记录。

删除数据

使用delete_one 或者 delete_many函数,用法和find函数类似,同样指定where对象即可。delete_many会删除所有符合的记录。

使用如下代码删除所有number大于10000的记录

mongoclient = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongoclient["test"]
col = db["testCollection"]

where = {
    "number": {"$gt": 10000}
}
col.delete_many(where)

检查删除结果
python mongodb驱动 pymongo模块常见用法总结_第5张图片

你可能感兴趣的:(python,数据库,python,mongodb,pymongo)