Python如何使用pymongo连接MongoDB数据库并进行相关操作
作者:kim samuel
一、基本概述
目前电脑上已经下载了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()
总结
到此这篇关于Python如何使用pymongo连接MongoDB数据库并进行相关操作的文章就介绍到这了,更多相关pymongo连接MongoDB数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!