服务器之家

服务器之家 > 正文

如何用python 操作MongoDB数据库

时间:2021-10-13 13:39     来源/作者:三只松鼠

一、前言

  mongodb属于 nosql(非关系型数据库),是一个基于分布式文件存储的开源数据库系统。

二、操作 mongodb

1、安装 pymongo

python 使用第三方库来连接操作 mongodb,所以我们首先安装此库。

pip3 install pymongodb

2、连接 mongodb

使用 mongoclient 类连接,以下两种参数方式都可以:

?
1
2
3
4
5
6
from pymongo import mongoclient
 
# 连接方式一
client = mongoclient(host='localhost',port=27017)
# 连接方式二
# client = mongoclient('mongodb://localhost:27017/')

3、选择数据库

mongodb 可以创建很多 db,指定我们需要的 db 即可

?
1
2
3
4
# 方式一
db = client.monitor
# 方式二
# db = client['monitor']

4、选择集合

db 内包含很多个集合,有点类似 mysql 这类关系型数据库中的表

?
1
2
3
4
# 方式一
collection = db.test
# 方式二
# collection = db['test']

5、插入数据

插入一条数据,mongodb 每条记录都有一个唯一标识。返回一个 insertoneresult 对象,若需要获取唯一标识,找到 insertoneresult 对象的属性 inserted_id 即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from pymongo import mongoclient
 
class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = mongoclient(host=host,port=port)
        self.db = client[db]
 
    def insert_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 要插入的字典
        :return: 返回一个包含objectid类型的对象
        '''
        collection = self.db[table]
        rep = collection.insert_one(dic)
 
        return repif __name__=='__main__':
    dic = {'姓名':'小明','english':100,'math':90}
    db = mongodb(host='localhost',db = 'test')
    rep = db.insert_one('test',dic)
    print(rep.inserted_id)

插入多条数据,使用 insert_many 批量插入

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from pymongo import mongoclient
 
class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = mongoclient(host=host,port=port)
        self.db = client[db]
 
    def insert_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 要插入的字典
        :return: 返回包含一个objectid类型的对象
        '''
        collection = self.db[table]
        rep = collection.insert_one(dic)
 
        return rep
 
    def insert_many(self,table,lists):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 要插入的列表,列表中的元素为字典
        :return: 返回包含多个objectid类型的列表对象
        '''
        collection = self.db[table]
        rep = collection.insert_many(lists)
 
        return rep
 
 
if __name__=='__main__':
    lists = [{'姓名':'小明','english':100,'math':90},
             {'姓名':'小华','english':90,'math':100}]
    db = mongodb(host='localhost',db = 'test')
    rep = db.insert_many('test',lists)
    for i in rep.inserted_ids:
        print(i)

6、查询

1)常规查询

  •  find_one :查询单条记录,返回一个字典。
  •  find:查询多条记录 ,返回一个游标对象。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from pymongo import mongoclient
 
class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = mongoclient(host=host,port=port)
        self.db = client[db]
 
    def find_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: dict 返回单条记录的字典
        '''
        collection = self.db[table]
        rep = collection.find_one(dic)
 
        return rep
 
    def find(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: list 返回查询到记录的列表
        '''
        collection = self.db[table]
        rep = list(collection.find(dic))
 
        return rep
 
if __name__=='__main__':
    # 查询 english 成绩为 100 的所有记录
    dic = {'english':100}
    db = mongodb(host='localhost',db = 'test')
    rep = db.insert_many('test',dic)
    print(rep)

2)范围查询

有时候我们需要范围比较查询,比如要查询 english 成绩为 80~90 ,可以使用比较符:dic = {'english':{'$in':[80,90]}}

  • $lt :小于
  • $lte:小于等于
  • $gt:大于
  • $gte:大于等于
  • $ne:不等于
  • $in:在范围内
  • $nin:不在范围内 

3)计数

直接调用 count() 方法,返回一个 int 类型的数字

?
1
2
3
# 计数查询只需要在普通查询后加上 count() 即可
count = collection.find().count() 
# count = collection.find({'english':{'$gt':90}}).count()

4)排序

排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志,返回一个游标对象

?
1
2
# 正序 ascending,倒序 descending。list()将游标对象转成列表
data = list(collection.find(dic).sort('姓名',pymongo.descending))

7、更新数据

首选查到需要更新的数据,然后将该数据更新,返回一个 updataresult 对象, raw_result 属性中包含 update 生效的个数。

  • update_one:更新查询到的第一条数据
  • update_many:更新多条数据
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from pymongo import mongoclient
 
class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = mongoclient(host=host,port=port)
        self.db = client[db]
 
    def update_one(self,table,condition,dic):
        '''
        :param table: str 数据库中的集合
        :param condition: dict 查询条件
        :param dic: dict 更新的数据
        :return: 返回updateresult对象
        '''
        collection = self.db[table]
        # $set 表示只更新dic字典内存在的字段
        rep = collection.update_one(condition,{'$set':dic})
        # 会把之前的数据全部用dic字典替换,如果原本存在其他字段,则会被删除
        # rep = collection.update_one(condition, dic)
 
        return rep
 
    def update_many(self,table,condition,dic):
        '''
        :param table: str 数据库中的集合
        :param condition: dict 查询条件
        :param dic: dict 更新的数据
        :return:返回updateresult对象
        '''
        collection = self.db[table]
        # $set 表示只更新dic字典内存在的字段
        rep = collection.update_many(condition,{'$set':dic})
        # 会把之前的数据全部用dic字典替换,如果原本存在其他字段,则会被删除
        # rep = collection.update_many(condition, dic)
 
        return rep
 
 
if __name__=='__main__':
    condition = {'english':80}
    dic = {'english':60}
    db = mongodb(host='mongodb-monitor.monitor.svc.test.local',db = 'test')
    rep = db.update_one('test',condition,dic)
    print(rep.raw_result)
    # 输出 {'n': 1, 'nmodified': 1, 'ok': 1.0, 'updatedexisting': true}

8、删除

删除和 update 类似,删除数据后,返回一个 deleteresult 对象, raw_result 属性中包含 delete 的个数

  • delete_one:删除查询到的第一条数据
  • delete_many:批量删除符合查询条件的数据
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from pymongo import mongoclient
 
class mongodb:
    def __init__(self,host,db,port = 27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口,默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = mongoclient(host=host,port=port)
        self.db = client[db]
 
    def delete_one(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: 返回deleteresult对象
        '''
        collection = self.db[table]
        rep = collection.delete_one(dic)
 
        return rep
 
    def delete_many(self,table,dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: 返回deleteresult对象
        '''
        collection = self.db[table]
        rep = collection.delete_many(dic)
 
        return rep
 
 
if __name__=='__main__':
    dic = {'english':60}
    db = mongodb(host='localhost',db = 'test')
    rep = db.delete_many('test',dic)
    print(rep.raw_result)
    # 输出 {'n': 21, 'ok': 1.0}

以上就是如何用python 操作mongodb数据库的详细内容,更多关于python 操作mongodb数据库的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/shenh/p/14416111.html

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部