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"})