安装
Python 要连接 MongoDB 需要 MongoDB 驱动。
pip安装:
python3 -m pip3 install pymongo
创建数据库
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["loaderman"]
注意: 在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
判断数据库是否已存在:
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
dblist = myclient.list_database_names()
# dblist = myclient.database_names()
if "loaderman" in dblist:
print("数据库已存在!")
注意:database_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_database_names()。
创建集合
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["loaderman"]
mycol = mydb["t_user"]
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['loaderman']
collist = mydb. list_collection_names()
# collist = mydb.collection_names()
if "t_user" in collist: # 判断 sites 集合是否存在
print("集合已存在!")
插入数据
用 insert_one() 方法,该方法的第一参数是字典 name => value 对。
插入单个数据:
import pymongo
def main():
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["loaderman"]
mycol = mydb["t_user"]
mydict = {"name": "loaderman", "age": "18", "des": "码上加油站,一起来加油"}
x = mycol.insert_one(mydict)
print(x.inserted_id)
if __name__ == "__main__":
main()
输出:
5f05c019381b3ce588e04696
效果:
插入多条数据:
插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。
import pymongo
def main():
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["loaderman"]
mycol = mydb["t_site"]
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)
if __name__ == "__main__":
main()
输出:
[ObjectId('5f05c0c0bacd4ef964560988'), ObjectId('5f05c0c0bacd4ef964560989'), ObjectId('5f05c0c0bacd4ef96456098a'), ObjectId('5f05c0c0bacd4ef96456098b'), ObjectId('5f05c0c0bacd4ef96456098c')]
效果:
查询数据
使用 find_one() 方法来查询集合中的一条数据。
find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。 可以对find() 中设置参数来过滤数据。
如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
import pymongo
def main():
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["loaderman"]
mycol = mydb["t_site"]
# 使用 find_one() 方法来查询集合中的一条数据。
x = mycol.find_one()
print("***********查询集合中的一条数据。************")
print(x)
print("***********查询集合中的所有数据************")
# find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。
for x in mycol.find():
print(x)
print("***********除了 alexa 字段外,其他都返回************")
# find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。
for x in mycol.find({}, {"alexa": 0}):
print(x)
# 根据指定条件查询,查找 name 字段为 "QQ" 的数据:
myquery = {"name": "QQ"}
mydoc = mycol.find(myquery)
print("***********根据指定条件查询************")
for x in mydoc:
print(x)
# 读取 name 字段中第一个字母 ASCII 值大于 H" 的数据
myquery2 = {"name": {"$gt": "H"}}
mydoc2 = mycol.find(myquery2)
print("***********读取 name 字段中第一个字母ASCII值大于H的数据************")
for x in mydoc2:
print(x)
# 正则表达式查询,读取 name 字段中第一个字母为 "R" 的数据,正则表达式修饰符条件为 {"$regex": "^R"}
myquery = {"name": {"$regex": "Q"}}
print("***********正则表达式查询************")
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
print("***********返回指定条数记录3条数据************")
# 返回指定条数记录,查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
myresult = mycol.find().limit(3)
# 输出结果
for x in myresult:
print(x)
if __name__ == "__main__":
main()
运行输出:
***********查询集合中的一条数据。************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
***********查询集合中的所有数据************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
***********除了 alexa 字段外,其他都返回************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'url': 'https://www.github.com'}
***********根据指定条件查询************
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
***********读取 name 字段中第一个字母ASCII值大于H的数据************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
***********正则表达式查询************
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
***********返回指定条数记录3条数据************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
更新数据
import pymongo
def main():
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["loaderman"]
mycol = mydb["t_site"]
myquery = {"alexa": "100"}
newvalues = {"$set": {"alexa": "12345"}}
#修匹配到的第一条记录
mycol.update_one(myquery, newvalues)
# 输出修改后的 "sites" 集合
for x in mycol.find():
print(x)
myquery = {"name": {"$regex": "^F"}}
newvalues = {"$set": {"alexa": "66666"}}
#修改所有匹配到的记录
x1 = mycol.update_many(myquery, newvalues)
# 输出修改后的 "sites" 集合
for x in mycol.find():
print(x)
print(x1.modified_count, "文档已修改")
if __name__ == "__main__":
main()
输出:
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '12345', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '12356', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '12345', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '66666', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
1 文档已修改
排序
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。
import pymongo
def main():
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["loaderman"]
mycol = mydb["t_site"]
mydoc = mycol.find().sort("alexa")
for x in mydoc:
print(x)
if __name__ == "__main__":
main()
输出:
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '12345', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '66666', 'url': 'https://www.facebook.com'}
删除数据
用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档。
使用 drop() 方法来删除一个集合。
import pymongo
def main():
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["loaderman"]
mycol = mydb["t_site"]
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()
if __name__ == "__main__":
main()
输出:
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '66666', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
1 个文档已删除
3 个文档已删除
完
码上加油站
一起来加油
长按扫码关注
点“在看”你懂得