Python MongoDB
MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。
Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。 本实训项目主要学习如何安装pymongo,并通过该驱动建立连接,访问数据库,进行集合操作。
pymongo可参考菜鸟教程Python MongoDB | 菜鸟教程 (runoob.com)
增删改查等操作:Python Mongodb 插入文档 | 菜鸟教程 (runoob.com)
Python Mongodb 查询文档 | 菜鸟教程 (runoob.com)
Python Mongodb 修改文档 | 菜鸟教程 (runoob.com)
Python MongoDB 排序 | 菜鸟教程 (runoob.com)
Python Mongodb 删除数据 | 菜鸟教程 (runoob.com)
目录
第1关:python连接MongoDB写入数据
pip 安装
编程要求
第2关:检索文档
相关知识
实例1:查找 sites 集合中的所有数据
实例2:查询指定字段的数据
实例3:同时指定了 0 和 1 则会报错
实例4:查找 name 字段为 "RUNOOB" 的数据:
编程要求
第3关:更新数据
相关知识
任务描述
编程要求
一、本关任务:安装pymongo
二、相关知识
pip 是一个通用的 Python 包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能。 MongoDB的python接口pymongo的安装方法有多种,如源码、easy_install、pip都可以。采用pip安装,很简单。 pip install pymongo 安装完成后可以检查下安装信息 pip show pymongo 测试 PyMongo
1、导入pymongo库
import pymongo
2、使用MongoClient对象创建与数据库服务器的连接
如下实例中,我们创建的数据库 runoobdb :
client=MongoClient(host='127.0.0.1',port=12717) 也可以连接到具体的mongod服务器或副本集: client=MongoClient(host='10.90.9.102',port=12718) client=MongoClient(host='10.90.9.101:27018,10.90.9.102: 12718,10.90.9.103:27018') mydb = client["runoobdb"]
3、访问数据库
创建MongoClient实例后,就可以访问服务器中的任何数据。 如果要访问一个数据库,可以将其当作属性一样进行访问: db = client.myDB 也可以使用函数方式访问,如果不存在数据库,则系统会自动创建数据库: db = client.get_database("myDB")
注意:
在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
4、集合操作
(1)插入文档 在数据库中存储数据时,首先指定使用的集合,然后使用集合的insert_one()方法插入文档
mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" } x = mycol.insert_one(mydict)
(2)可以使用方法insert_many()同时插入多个文档。
mylist = [ { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" }, { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" }, { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" }, { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" }, { "name": "Github", "alexa": "109", "url": "https://www.github.com" } ] x = mycol.insert_many(mylist)
#输出所有插入文档的_id值:print(x.inserted_ids)
输出结果类似如下:
[ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]
按要求创建数据库连接及相应的数据库、集合 并向集合中写入如下文档: [ { "_id": 1, "name": "RUNOOB", "cn_name": "菜鸟教程"}, { "_id": 2, "name": "Google", "address": "Google 搜索"}, { "_id": 3, "name": "Facebook", "address": "脸书"}, { "_id": 4, "name": "Taobao", "address": "淘宝"}, { "_id": 5, "name": "Zhihu", "address": "知乎"} ]
根据提示,在右侧编辑器的#begin和#end之间按要求补充代码。
开始你的任务吧,祝你成功!
#/usr/bin/python3
import pymongo
def write_mycol():
##########begin##################
### 通过默认端口创建本地连接
client = pymongo.MongoClient(host='localhost',port=27017)
####创建mydb数据库及集合test,并向集合中写入要求的数据,写入后的结果集以mycol对象返回
mydb = client['mydb']
mycol = mydb['test']
mylist = [
{"_id":1,"name":"RUNOOB","cn_name":"菜鸟教程"},
{"_id":2,"name":"Google","address":"Google 搜索"},
{"_id":3,"name":"Facebook","address":"脸书"},
{"_id":4,"name":"Taobao","address":"淘宝"},
{"_id":5,"name":"Zhihu","address":"知乎"}
]
x = mycol.insert_many(mylist)
return mycol
##########end#####################
最开始输出测评时,系统自动生成加上了id....如图(我真的栓q),因为pymongo在字典没有id的情况下才会自动生成id,检查后发现是因为第二条数据输入的时候掉了‘_’,加上后就测评成功了。写代码的时候一定要仔细!
或者这样写也是可以的:
runoobdb数据库中sites集合中有如下文档
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
查询集合中所有数据
find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。
import pymongo
myclient= pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
for x in mycol.find():
print(x)
我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):
print(x)
输出结果为:
{'name': 'RUNOOB', 'alexa': '10000'}
{'name': 'Google', 'alexa': '1'}
{'name': 'Taobao', 'alexa': '100'}
{'name': 'QQ', 'alexa': '101'}
{'name': 'Facebook', 'alexa': '10'}
{'name': '知乎', 'alexa': '103'}
{'name': 'Github', 'alexa': '109'}
除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。
根据指定条件查询 我们可以在 find() 中设置参数来过滤数据。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
for x in mycol.find({},{ "name": 1, "alexa": 0 }):
print(x)
错误内容大概如下:
...
pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion.
...
(除了 alexa 字段外,其他都返回)
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myquery = { "name": "RUNOOB" }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
根据提示,在右侧编辑器 Begin-End 中补充代码(请勿删除原有代码框架)。
_id | name | sex | age |
---|---|---|---|
1 | Xiaoming | man | 21 |
2 | Xiaohong | woman | 20 |
3 | Xiaoliang | man | 22 |
#/usr/bin/python3
import pymongo
def read_mycol():
myclient = pymongo.MongoClient(host='127.0.0.1',port=27017)
mydb2 = myclient["mydb2"]
#########begin###########
####判断数据库mydb2中是否存在集合“test2”,如果存在则删除,重新创建同名集合
collist = mydb2.list_collection_names()
if "test2" in collist:
mydb2.test2.drop()
mycol = mydb2["test2"]
#########end#################
mylist2 = [
{ "_id": 1, "name": "Xiaoming", "sex": "man","age":21},
{ "_id": 2, "name": "Xiaohong", "sex": "woman","age":20},
{ "_id": 3, "name": "Xiaoliang", "sex": "man","age":22}]
##################begin###########
###向集合中写入数据对象mylist2,并查找age大于等于21的name,
mycol.insert_many(mylist2)
mycol_read = mycol.find({"age":{"$gte":21}},{"_id":1,"name":1})
#######end########################
return mycol_read #结果以mycol_read对象返回
1、更新数据
my_set.update(
, #查询条件
, #update的对象和一些更新的操作符
{
upsert: #如果不存在update的记录,是否插入
multi: #可选,mongodb 默认是false,只更新找到的第一条记录
writeConcern: #可选,抛出异常的级别。
}
)
总结:update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。如果查找到的匹配数据多于一条,则只会修改第一条;如果要修改所有匹配到的记录,可以使用 update_many()。
使用的测试数据如下:
以下实例将查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123:
实例:
import pymongo
myclient = pymongo.MongoClient(host="localhost",port=27018)
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myquery = {"name":{"$regex":"^F"}}
newvalues = {"$set":{"alexa":"123"}}
x = mycol.update_many(myquery,newvalues)
print(x.modified_count, "文档已修改")
输出结果为:
2、删除数据
可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。 使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
实例:删除所有 name 字段中以 F 开头的文档:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"] mycol = mydb["sites"]
myquery = {"name":{"$regex":"^F"}}
x = mycol.delete_many(myquery)
print(x.deleted_count, "个文档已删除")
根据提示,在右侧编辑器 Begin-End 中补充代码(请勿删除原有代码框架)。
_id | name | sex | age |
---|---|---|---|
1 | Xiaoming | man | 21 |
2 | Xiaohong | woman | 20 |
3 | Xiaoliang | man | 22 |
根据提示,在右侧编辑器补充代码
import pymongo
def update_mycol():
myclient = pymongo.MongoClient(host='127.0.0.1',port=27017)
mydb3 = myclient["mydb3"]
if("test3" in mydb3.list_collection_names()):
mydb3.drop_collection("test3")
mycol3 = mydb3["test3"]
mylist3 = [
{ "_id": 1, "name": "Xiaoming", "sex": "man","age":21},
{ "_id": 2, "name": "Xiaohong", "sex": "woman","age":20},
{ "_id": 3, "name": "Xiaoliang", "sex": "man","age":22}]
###写入数据对象,修改"Xiaohong"的年龄为23,并将修改后的对象返回
##################begin############
mycol3.insert_many(mylist3)
myquery = {"name":"Xiaohong"}
newvalues = {"$set":{"age":23}}
mycol_update = mycol3.update_one(myquery,newvalues)
##############end################
return mycol_update