Python-Pymongo-MongoDB

本文最后更新于:2021年6月8日 晚上

信息

Pymongo 是 Python 阻塞操作 MongoDB 的模块

安装

1
pip install pymongo

使用

创建连接

1
2
from pymongo import MongoClient
client = MongoClient("mongodb://mongodb0.example.net:27019")

MongoClient(‘mongodb://用户名:用户密码@服务IP:服务端口/‘)

访问数据库 Database

你可以使用属性访问的方式,赋值一个数据库(例如名字为primer)给本地变量db

1
db = client.primer

你也可以使用字典形式访问一个数据库

1
db = client['primer']

如果数据库不存在,那么会自动创建

访问集合 Collection

访问方式与访问database类似

1
2
coll = db.dataset
coll = db['dataset']

访问文档 Document

插入

如果你所插入的集合在MongoDB中不存在,MongoDB将为你自动创建一个集合

Collection.insert_one

插入一条数据

1
2
3
4
5
6
con = MyMongo.get_mongo_connect()
mydb = con["temp"]
mycol = mydb["cx_sxb_school"]
mydict = { "name": "EvilRecluse", "url": "https://evilrecluse.top/" }
x = mycol.insert_one(mydict)
print(result.inserted_id)

操作会返回了一个InsertOneResult对象,它包括了insert_id属性表示被插入的文档的_id

如果你传递给insert_one()方法的参数不包含_id字段,MongoClient将自动添加这个字段并且生成一个ObjectId设置为这个字段的值。

Collection.insert_many

插入多条数据

1
2
3
4
5
6
7
8
9
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]["sites"]
mylist = [
{ "name": "知乎", "url": "https://www.zhihu.com" },
{ "name": "Github", "url": "https://www.github.com" }
]

x = mycol.insert_many(mylist)
print(x.inserted_ids)

查询

查询方法

Collection.find_one

查询集合,得到一个结果,通常用于看看搜索结果的样式

Collection.find

用于查询多个结果,查询可以返回在集合中的所有数据或者只返回符合筛选条件
方法返回一个查询结果的游标,这是一个产生文档的迭代对象
如果不传入任何参数,则返回所有结果

需要注意的是,如果你不指定不返回_id,那么会默认返回这个项
你可以使用比较运算符之类的操作,具体见比较逻辑

查询参数

这些参数可以在查询时传入,也可以对查询结果进行处理

sort

对结果进行排序

1
2
database.collect.find({}, sort=[(key1, ind1), (key2, ind2)])
database.collect.find({}).sort([(key1, ind1), (key2, ind2)])
  • key: 用来排序的键
  • ind: 排序顺序,可以填入1或-1

limit

限定返回的最大结果数量

1
2
database.collect.find({}, limit=2)
database.collect.find({}).limit(2)

skip

跳过指定数量的结果

1
2
database.collect.find({}, skip=1)
database.collect.find({}).limit(1)

常用操作

根据_id查询

1
2
3
from bson.objectid import ObjectId

articles.find_one({‘_id’: ObjectId(‘50f0d76347f4ec148890ef1e’)})

比较查询

< <= > >= !=
$lt $lte $gt $gte $ne

如果你希望应对数据库中不存在的null,你可以在python中填入None来与之对应

案例:字段非空查询

1
col.find({"字段名":{"$ne":None}},{})

更新

将某个数据记录的某系字段进行更改

  • update_one()
    修改匹配的第一条记录
    第一个参数为查询的条件,第二个参数为要修改的字段

    案例:将name为DIO的记录的power项改为stander

    1
    2
    mycol.update_one(
    { "name": "DIO" }, { "$set": {'power":"stander" } })
  • update_many()
    修改匹配的所有记录
    参数与update_one是一样的

    案例:修改所有name是JO开头的power项值为1000000

    1
    mycol.update_many({"name": { "$regex": "^JO" } }, { "$set": { "power": "1000000" } })

    替换

    将旧的文档丢弃,传入一个新的文档替代原本的文档
  • update()
    替代文档对应原来的文档可以有不同的字段
    替代文档可以忽略_id字段因为它是不变的。(如果你硬是要填入那它必须和原文档的值相同)
    1
    2
    3
    4
    5
    6
    7
    result = db.restaurants.replace_one(
    {"_id": "5f60b67d7c68de24d1745024"},
    {
    "name": "DIO",
    "power": "The World"
    }
    )

删除

文档

  • delete_one()
    删除第一个匹配的项

    案例:删除找寻出来第一个name为Jax的记录

    1
    mycol.delete_one({ "name": "Jax" })
  • delete_many()
    删除多个文档
    如果不传入参数,则删除集合中的所有文档

    案例:删除所有name以F开头的记录

    1
    mycol.delete_many({ "name": {"$regex": "^F"} })

    集合

  • drop()
    删除一个集合
    1
    mycol.drop()

    聚合

  • aggregate

    案例:
    使用$group操作符去利用一个指定的键进行分组。在$group操作中,指定需要分组的字段为_id。$group通过字段路径访问字段,该字段需要有一个美元符号$作为前缀。$group操作可以使用累加器对本次分组进行计算。下面的例子将使用borough字段对restaurants集合进行操作,并且使用$sum累加器进行文档的统计计算。

    1
    2
    3
    4
    5
    cursor = db.restaurants.aggregate(
    [
    {"$group": {"_id": "$borough", "count": {"$sum": 1}}}
    ]
    )

    其它操作

    保存較大的二進制文件

    将图片、文档等存入mogodb中,需要用到两个模块,pymongo和gridfs
    在存入过程中必须将文件转换为二进制的格式才能存入,存入mongoDB中会生成两个文件 xxx.chunkxxx.files

GridFS是一种将大型文件存储在 MongoDB 的文件规范:数据库支持以BSON格式保存二进制对象
但是MongoDBBSON对象 最大不能超过 4MB

GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档

为实现这点,该规范指定了一个将文件分块的标准
每个文件都将在文件集合对象中保存一个元数据对象,一个或多个块对象可被组合保存在一个块集合中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pymongo
import gridfs
from bson import ObjectId

client = pymongo.MongoClient('localhost', connect=False)
db = client['demo']

# 存储到mongodb
def save_file_to_mongo(content):
with open(content, 'rb') as f:
data = f.read()
fs = gridfs.GridFS(db, 'img')
return fs.put(data)

# 从mongodb取出文件
def get_file_from_mongo(id):
fs = gridfs.GridFS(db, 'img')
gf = fs.get(ObjectId(id))
content = gf.read()
# 将文件写入硬盘
with open('test.jpg', 'wb' ) as f:
f.write(content)

id = save_file_to_mongo('test2.jpg')
write_to_disk(get_file_from_mongo(id))


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!