Python MongoDB

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。

安装

pip3 install pymongo

导入模块

import pymongo

建立本地链接

cl = pymongo.MongoClient('localhost', 27017)

## 或者

cl = Mongocl('mongodb://localhost:27017/')

获取数据库

一个MongoDB实例可以支持多个独立的 数据库。在使用PyMongo时,您可以使用Mongocl实例上的属性样式访问来访问数据库:

## 查看当前都有那些库
cl.database_names()

## 获取数据库对象
db = cl.test_database

或者

db = cl['test_database']

获取集合

一个集合是一组存储在MongoDB中的文档,并且可以被认为是大致在关系数据库中的表。
在 PyMongo 中获取集合与获取数据库的工作方式相同:

## 查看当前库中都有那些集合
db.collection_names()

## 获取集合对象
collection = db.test_collection

## 或者

collection = db['test-collection']

合法的集合名:

  • 集合名不能是空字符串""。
  • 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
  • 集合名不能以"system."开头,这是为系统集合保留的前缀。
  • 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

惰性机制

关于MongoDB中的集合(和数据库)的一个重要注意事项是它们是懒惰地创建的。
上述命令都没有在MongoDB服务器上实际执行过任何操作。集合和数据库在第一个文档被插入时创建。

创建集合

MongoDB 中的集合类似 SQL 的表。

MongoDB 使用数据库对象来创建集合,实例如下:

#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
 
mycol = mydb["sites"]

注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

判断集合是否已存在

我们可以读取 MongoDB 数据库中的所有集合,并判断指定的集合是否存在:

#!/usr/bin/python3
 
import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
 
mydb = myclient['runoobdb']
 
collist = mydb. list_collection_names()
# collist = mydb.collection_names()
if "sites" in collist:   # 判断 sites 集合是否存在
  print("集合已存在!")

注意:collection_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_collection_names()。

增、删、改、查等操作

下表列出了 MongoDB 的更多操作,详情可点击具体链接:

序号

功能

1

添加数据

2

查询数据

3

修改数据

4

数据排序

5

删除数据

添加一条数据

返回插入数据的_id

ret = collection.insert({"name":"test10010","age":33})
print(ret)

添加多条数据

返回ObjectId对象构成的列表

item_list = [{"name":"test1000{}".format(i)} for i in range(10)]
rets = collection.insert(item_list)
print(rets)
for ret in rets:
    print(ret)

find_one()查找一条数据

接收一个字典形式的条件,返回字典形式的整条数据 如果条件为空,则返回第一条

ret = client.test.test.find_one({'name': 'test10001'})
print(ret) # 包含mongodb的ObjectId对象的字典
_ = ret.pop('_id') # 清除mongodb的ObjectId对象的k,v
print(ret)

find()查找全部数据

返回所有满足条件的结果,如果条件为空,则返回全部 结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,但是只能够进行一次读取

rets = collection.find({"name":"test10005"}),
for ret in rets:
    print(ret)
for ret in rets: #此时rets中没有内容
    print(ret)

delete_one()删除一条数据

collection.delete_one({"name":"test10010"})

delete_many()删除全部数据

collection.delete_many({"name":"test10010"})