localhost 已拒绝连接_【Python】MongoDB数据库的连接和操作

606c6525debadcfe451ebcdbc474da16.gif

安装

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

效果:

620213b1e62ea4fa1c800b780cb6c488.png

插入多条数据:

插入多个文档使用 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')]

效果:

bb10bd153252631e6bb5fe386d0310fa.png

查询数据

  • 使用 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 个文档已删除

  码上加油站

  一起来加油

长按扫码关注

d9d3c7d3f4d7ebcd3dbd2e939d5fa999.png

点“在看”你懂得

0bd902120d2ff105ce4f5ce55b6a2b43.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值