Python如何使用pymongo连接MongoDB数据库并进行相关操作
作者:kim?samuel 时间:2023-05-12 01:21:49
一、基本概述
目前电脑上已经下载了MongoDB数据库、navicat for mongodb作为mongoDB的可视化工具,形如navicat for mysql作为mysql的可视化工具。
使用Pycharm编写python代码连接mongodb,创建数据库,创建集合(集合是指形如mysql中的sql数据表)等操作。
使用pymongo进行数据库连接,因此需要在pycharm中下载。
二、创建数据库
创建数据库需要使用 MongoClient 对象,并且指定连接的 URL 地址和要创建的数据库名。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#新建数据库
mydb = myclient["runoobdbs"]
注意:
此时navicat还无法看见新建的数据库,这是因为在 MongoDB 中,数据库只有在内容插入后才会创建!
就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
三、判断数据库是否存在
代码如下:
#判断数据库是否存在
dblist = myclient.list_database_names() #list_database_names()获取数据库名
# dblist = myclient.database_names()
if "runoobdbs" in dblist:
print("数据库已存在!")
四、创建集合
代码如下:
#创建集合
mycol = mydb["sites"]
五、判断集合是否存在
代码如下:
#判断集合是否存在
collist = mydb. list_collection_names() #获取集合名
# collist = mydb.collection_names()
if "sites" in collist: # 判断 sites 集合是否存在
print("集合已存在!")
此时仍旧无法显示数据库和集合名。
六、插入文档
1.插入单个文档
文档就是指的里面的数据。
#插入文档
mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"}
x = mycol.insert_one(mydict)
print(x)
若是没有数据库、集合在,此代码上面要有创建数据库、创建集合的代码。
代码运行前MongoDB显示数据库名称:
代码运行后MongoDB显示数据库名称:
运行后navicat fo rmongodb显示如下:
Pycharm运行第一次结果:
第二次运行结果:
此时全部代码有:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#新建数据库
mydb = myclient["runoobdbs"]
#判断数据库是否存在
dblist = myclient.list_database_names() #list_database_names()获取数据库名
# dblist = myclient.database_names()
if "runoobdbs" in dblist:
print("数据库已存在!")
#创建集合
mycol = mydb["sites"]
#判断集合是否存在
collist = mydb. list_collection_names() #获取集合名
# collist = mydb.collection_names()
if "sites" in collist: # 判断 sites 集合是否存在
print("集合已存在!")
#插入文档
mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"}
x = mycol.insert_one(mydict)
print(x)
2.返回 _id 字段
insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。
返回 _id 字段只需要在以上代码最后下再加一句print(x.inserted_id)
即可。
结果是:
而此时由于运行了三次,出现了三行内容一样,id不一样的文档。
3.插入多个文档
集合中插入多个文档使用 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)
Pycharm运行结果:
navicat显示如下:
也可以使用MongoDB查看。
补充:
use+空格+数据库
,作用是数据库不在时新建,在时切换到此数据库下。db.creatCollection('集合名')
,创建集合。db.集合名.find()
方法显示此集合下所有数据。
4.插入指定 _id 的多个文档
我们也可以自己指定 id,插入,以下实例我们在 site2 集合中插入数据,_id 为我们指定的:
mycol2 = mydb["site2"]
mylist2 = [
{"_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 = mycol2.insert_many(mylist2)
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)
Pycharm运行结果:
navicat显示如下:
此时全部代码如下:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#新建数据库
mydb = myclient["runoobdbs"]
#创建集合
mycol = mydb["sites"]
'''
#判断数据库是否存在
dblist = myclient.list_database_names() #list_database_names()获取数据库名
# dblist = myclient.database_names()
if "runoobdbs" in dblist:
print("数据库已存在!")
#判断集合是否存在
collist = mydb. list_collection_names() #获取集合名
# collist = mydb.collection_names()
if "sites" in collist: # 判断 sites 集合是否存在
print("集合已存在!")
'''
#插入文档
#mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"}
#x = mycol.insert_one(mydict)
#print(x)
#print(x.inserted_id)
#插入多个文档
#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)
#插入多条不同id的文档
mycol2 = mydb["site2"]
mylist2 = [
{"_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 = mycol2.insert_many(mylist2)
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)
七、查询文档
本节上个内容有显示MongoDB查询文档的操作,在Pycharm里如何实现查询呢?
1.查询一条数据
#查询一条数据
x = mycol.find_one()
print(x)
Pycharm运行结果:
2.查询集合中所有数据
find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。
#查询所有数据
for x in mycol.find():
print(x)
Pycharm运行结果:
3.查询指定字段的数据
我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。
除了 _id,你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。
不能出现类似这样的代码for x in mycol.find({},{ "name": 1, "alexa": 0 }):
。
#返回指定字段
for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }): #意思是只返回name和alexa,不要id
print(x)
for x in mycol.find({},{ "alexa": 0 }): #除了alexa字段,其他都返回
print(x)
运行结果是:
4.根据指定条件查询
我们可以在 find() 中设置参数来过滤数据。
#根据指定条件查询
myquery = {"name": "RUNOOB"}
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
运行结果:
5.高级查询
查询的条件语句中,我们还可以使用修饰符。
以下实例用于读取 name 字段中第一个字母 ASCII 值大于 “H” 的数据,大于的修饰符条件为 {“$gt”: “H”} :
#高级查询
myquery = { "name": { "$gt": "H" }}
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
运行结果:
MongoDB中条件操作符有:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
6.使用正则表达式查询
我们还可以使用正则表达式作为修饰符。
正则表达式修饰符只用于搜索字符串的字段。
以下实例用于读取 name 字段中第一个字母为 “R” 的数据,正则表达式修饰符条件为 {“$regex”: “^R”} :
$regex为模糊查询的字符串提供正则表达式功能。
#使用正则表达式查询
myquery = {"name": {"$regex": "^R"}} #查询name中以R开头的数据
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
运行结果:
7.返回指定条数记录
如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
以下实例返回 3 条文档记录:
#返回指定条数
myresult = mycol.find().limit(3) #查询前三条数据
# 输出结果
for x in myresult:
print(x)
八、修改文档
在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。
如果查找到的匹配数据多于一条,则只会修改第一条。
更新前的数据如下:
代码如下:
#修改一条数据
myquery = {"alexa": "10000"} #将alexa的10000的数据值改为12345
newvalues = {"$set": {"alexa": "12345"}}
mycol.update_one(myquery, newvalues)
# 输出修改后的 "sites" 集合
for x in mycol.find():
print(x)
更新后:
update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()。
以下实例将查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123:
#修改多条数据
myquery = {"name": {"$regex": "^F"}} #寻找以F开头的name,将其alexa值改为123
newvalues = {"$set": {"alexa": "123"}}
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文档已修改")
更新后:
九、排序
sort() 方法可以指定升序或降序排序。
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。
#排序 将alexa以升序排序
mydoc = mycol.find().sort("alexa")
for x in mydoc:
print(x)
结果如下:
降序排序:
#alexa降序
mydoc = mycol.find().sort("alexa", -1)
for x in mydoc:
print(x)
结果如下:
十、删除文档
1.删除一个文档
使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
删除前的数据库如图:
#删除一条数据
myquery = { "name": "Taobao" }
mycol.delete_one(myquery)
# 删除后输出
for x in mycol.find():
print(x)
删除后:
2.删除多个文档
我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
删除所有 name 字段中以 F 开头的文档:
#删除多条数据
myquery = {"name": {"$regex": "^F"}}
x = mycol.delete_many(myquery)
print(x.deleted_count, "个文档已删除")
删除后:
3.删除集合中的所有文档
delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:
#删除集合中所有文档
x = mycol.delete_many({}) #mycol = mydb["sites"]连的是sites,所以会删除sites里的所有文档
print(x.deleted_count, "个文档已删除")
删除后:
4.删除集合
我们可以使用 drop() 方法来删除一个集合。
#删除集合
mycol.drop()
总代码有:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
#新建数据库
mydb = myclient["runoobdbs"]
#创建集合
mycol = mydb["sites"]
'''
#判断数据库是否存在
dblist = myclient.list_database_names() #list_database_names()获取数据库名
# dblist = myclient.database_names()
if "runoobdbs" in dblist:
print("数据库已存在!")
#判断集合是否存在
collist = mydb. list_collection_names() #获取集合名
# collist = mydb.collection_names()
if "sites" in collist: # 判断 sites 集合是否存在
print("集合已存在!")
'''
#插入文档
#mydict = {"name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com"}
#x = mycol.insert_one(mydict)
#print(x)
#print(x.inserted_id)
#插入多个文档
#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)
#插入多条不同id的文档
#mycol2 = mydb["site2"]
#mylist2 = [
# {"_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 = mycol2.insert_many(mylist2)
# 输出插入的所有文档对应的 _id 值
#print(x.inserted_ids)
#查询一条数据
#x = mycol.find_one()
#print(x)
#查询所有数据
#for x in mycol.find():
# print(x)
#返回指定字段
#for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }): #意思是只返回name和alexa,不要id
# print(x)
#for x in mycol.find({},{ "alexa": 0 }): #除了alexa字段,其他都返回
# print(x)
#根据指定条件查询
#myquery = {"name": "RUNOOB"}
#mydoc = mycol.find(myquery)
#for x in mydoc:
# print(x)
#高级查询
#myquery = { "name": { "$gt": "H" }}
#mydoc = mycol.find(myquery)
#for x in mydoc:
# print(x)
#使用正则表达式查询
#myquery = {"name": {"$regex": "^R"}}
#mydoc = mycol.find(myquery)
#for x in mydoc:
# print(x)
#返回指定条数
#myresult = mycol.find().limit(3)
# 输出结果
#for x in myresult:
# print(x)
#修改一条数据
#myquery = {"alexa": "10000"} #将alexa的10000的数据值改为12345
#newvalues = {"$set": {"alexa": "12345"}}
#mycol.update_one(myquery, newvalues)
# 输出修改后的 "sites" 集合
#for x in mycol.find():
# print(x)
#修改多条数据
#myquery = {"name": {"$regex": "^F"}} #寻找以F开头的name,将其alexa值改为123
#newvalues = {"$set": {"alexa": "123"}}
#x = mycol.update_many(myquery, newvalues)
#print(x.modified_count, "文档已修改")
#排序 将alexa以升序排序
#mydoc = mycol.find().sort("alexa")
#for x in mydoc:
# print(x)
#alexa降序
#mydoc = mycol.find().sort("alexa", -1)
#for x in mydoc:
# print(x)
#删除一条数据
#myquery = {"name": "Taobao"}
#mycol.delete_one(myquery)
# 删除后输出
#for x in mycol.find():
# print(x)
#删除多条数据
#myquery = {"name": {"$regex": "^F"}}
#x = mycol.delete_many(myquery)
#print(x.deleted_count, "个文档已删除")
#删除集合中所有文档
#x = mycol.delete_many({})
#print(x.deleted_count, "个文档已删除")
#删除集合
mycol.drop()
来源:https://blog.csdn.net/qq_45268814/article/details/125937255