一、基本概述

目前电脑上已经下载了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显示数据库名称:
1
代码运行后MongoDB显示数据库名称:
2
运行后navicat fo rmongodb显示如下:
3
Pycharm运行第一次结果:
4
第二次运行结果:
5
此时全部代码有:

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)即可。
结果是:
1
而此时由于运行了三次,出现了三行内容一样,id不一样的文档。
1
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运行结果:
1
navicat显示如下:
2
也可以使用MongoDB查看。
1

补充:
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运行结果:
1
navicat显示如下:
1
此时全部代码如下:

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运行结果:
1
2.查询集合中所有数据
find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。

#查询所有数据
for x in mycol.find():
  print(x)

Pycharm运行结果:
1
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)

运行结果是:
1
2
4.根据指定条件查询
我们可以在 find() 中设置参数来过滤数据。

#根据指定条件查询
myquery = {"name": "RUNOOB"}
mydoc = mycol.find(myquery)
for x in mydoc:
  print(x)

运行结果:
1
5.高级查询
查询的条件语句中,我们还可以使用修饰符。
以下实例用于读取 name 字段中第一个字母 ASCII 值大于 “H” 的数据,大于的修饰符条件为 {“$gt”: “H”} :

#高级查询
myquery = { "name": { "$gt": "H" }}
mydoc = mycol.find(myquery)
for x in mydoc:
  print(x)

运行结果:
1

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)

运行结果:
1
7.返回指定条数记录
如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
以下实例返回 3 条文档记录:

#返回指定条数
myresult = mycol.find().limit(3)     #查询前三条数据
# 输出结果
for x in myresult:
  print(x)

1

八、修改文档

在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。
如果查找到的匹配数据多于一条,则只会修改第一条。
更新前的数据如下:
1
代码如下:

#修改一条数据
myquery = {"alexa": "10000"}    #将alexa的10000的数据值改为12345
newvalues = {"$set": {"alexa": "12345"}}
mycol.update_one(myquery, newvalues)
# 输出修改后的  "sites"  集合
for x in mycol.find():
  print(x)

更新后:
1
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, "文档已修改")

更新后:
1

九、排序

sort() 方法可以指定升序或降序排序。
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。

#排序            将alexa以升序排序
mydoc = mycol.find().sort("alexa")
for x in mydoc:
  print(x)

结果如下:
1
降序排序:

#alexa降序
mydoc = mycol.find().sort("alexa", -1)
for x in mydoc:
  print(x)

结果如下:
1

十、删除文档

1.删除一个文档
使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
删除前的数据库如图:
1

#删除一条数据
myquery = { "name": "Taobao" }
mycol.delete_one(myquery)
# 删除后输出
for x in mycol.find():
  print(x)

删除后:
2
2.删除多个文档
我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
删除所有 name 字段中以 F 开头的文档:

#删除多条数据
myquery = {"name": {"$regex": "^F"}}
x = mycol.delete_many(myquery)
print(x.deleted_count, "个文档已删除")

删除后:
1
3.删除集合中的所有文档
delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:

#删除集合中所有文档
x = mycol.delete_many({})       #mycol = mydb["sites"]连的是sites,所以会删除sites里的所有文档
print(x.deleted_count, "个文档已删除")

删除后:
1
4.删除集合
我们可以使用 drop() 方法来删除一个集合。

#删除集合
mycol.drop()

1
总代码有:

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()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐