文档型数据库通常是以JSON或XML格式存储数据,而Mongodb使用的数据结构是BSON,即二进制JSON。和JSON相比,BSON提高了存储和扫描效率,但空间占用会更多一些。
本文默认已经安装了MongoDB服务器,着重介绍Python操作MongoDB的库PyMongo,在命令行中输入如下内容安装:
- # Windows
- pip install pymongo
- # Mac
- pip3 install pymongo
一、连接服务器
连接服务器需要提供一个地址和接口
- import pymongo
- client = pymongo.MongoClient(host='localhost', 27017)
- # 地址和端口也可以用一个字符串完成
- client = pymongo.MongoClient('mongodb://localhost:27017/')
27017 是默认端口。如果设置过密码进行连接就不能简单使用上面的代码了,需要在代码中带上密码:
- import pymongo
- client = pymongo.MongoClient(host='localhost', 27017)
- auth = mongo_client.admin
- auth.authenticate('用户名', '密码')
连接服务器可以用下面的代码判断是否成功:
- print(client.server_info())
二、获取数据库
获取数据库有以下两种表述方法(以数据库 data 为例):
- # 方法一
- db = client['data']
- # 方法二
- db = client.data
另外需要说明,MongoDB不需要提前创建好数据库,而是直接使用,如果发现没有则自动创建一个 testdb 的数据库:
- db = client.testdb
三、获取集合
非关系型数据库中的集合类似于关系型数据库中的表获取集合与获取数据库类似,同样有两种方法(以集合 practice 为例):
- collection = db['practice']
- # 方法二
- collection = db.practice
四、插入数据
下面的操作进行前默认已经通过代码获取到了 practice 集合:
- import pymongo
- client = pymongo.MongoClient(host='localhost', 27017)
- db = client.data
- collection = db.practice
4.1 插入单条数据
数据形式是字典,可以通过 insert_one 完成单个数据的写入:
- data = {
- 'name' : 'Chenxi',
- 'text' : 'Hello World',
- 'tags' : ['a', 'b', 'c']
- }
- collection.insert_one(data)
在MongoDB中,每条数据都有_id属性来唯一标识。可以输出返回的id确认数据情况:
- result = collection.insert_one(data)
- print(result.inserted_id)
4.2 插入多条数据
如果有多条数据,每条数据形式依然是字典,但需要组合成字典列表的形式后用 insert_many() 完成写入:
- data1 = {
- 'name' : 'Chenxi',
- 'text' : 'Hello World',
- 'tags' : ['a', 'b', 'c']
- }
- data2 = {
- 'name' : 'Zaoqi',
- 'text' : 'Hello World',
- 'tags' : ['a', 'b', 'c']
- }
- collection.insert_many([data1, data2])
五、删除数据
5.1 删除单条数据
删除一条数据。若删除条件相同匹配到多条数据,默认删除第一条。如上例中插入的两条数据均符合 {'text' : 'Hello World'} 那么通过 delete_one 会删除第一条数据,保留 {'name' : 'Zaoqi'} 这条数据:
- collection.delete_one({'text' : 'Hello World'})
5.2 删除多条数据
删除满足条件的所有数据。如上例中插入的两条数据均符合 {'text' : 'Hello World'} 那么通过 delete_many 会删除全部两条数据:
- collection.delete_many({'text' : 'Hello World'})
六、更新数据
6.1 更新单条数据
类似删除单条数据,只会更新满足条件的第一条数据。代码为 update_one(filter,update,upsert=False),其中第一个参数 filter为更新的条件,第二个参数 update 为更新的内容,第三个参数 upsert 默认 False, 若为 True 则当更新条件没找到时会插入更新的内容
- data3 = {
- 'name': 'Xiaoming',
- 'text': 'Goodbye World',
- 'tags': [1, 2, 3]
- }
- update_condition = {'name' : 'Chenxi'}
- collection.update_one(update_condition, {'$set' : data3})
6.2 更新多条数据
有了上面删除和插入多条数据的认识,就很好理解更新多条数据的逻辑了,同理也是更新符合条件的全部数据。
- data3 = {
- 'name': 'Xiaoming',
- 'text': 'Goodbye World',
- 'tags': [1, 2, 3]
- }
- update_condition = {'text' : 'Hello World'}
- collection.update_many(update_condition, {'$set' : data3})
七、查询数据
7.1 查询单条数据
匹配第一条满足的条件的结果,这条结果以字典形式返回,若没有查询到,则返回 None
- find_result = collection.find_one({'text' : 'Hello World'})
- print(find_result)
可以通过 projection 参数来指定需要查询的字段:
- find_result = collection.find_one({'text' : 'Hello World'}, projection= {'_id':False, 'name':True, 'tags':False})
- print(find_result)
7.2 查询多条数据
返回满足条件的所有结果,返回后需要通过迭代获取每个查询结果,每个结果类型为字典。和之前的增、删、改不类似,查询多条为 find()
- find_result = collection.find({'text' : 'Hello World'})
- for i in find_result:
- print(i)
7.3 查询且删除
代码为 find_one_and_delete(filter,projection=None,sort=None,session=None,**kwargs),其中 sort为元祖列表类型,当查询匹配到多条数据时,根据某个条件排序,函数返回时返回第一条数据:
- find_condition = {'text' : 'Hello World'}
- deleted_item = collection.find_one_and_delete(find_condition, sort= [('name', pymongo.DESCENDING)])
- print(deleted_item)
查询也可以通过 $ 限定查询范围,常用内容如下:
img
八、计数
要统计查询结果有多少条数据,可以调用 count() 方法。具体操作如下:
- count = collection.find({'text' : 'Hello World'}).count()
- print(count)
九、排序
查询中已经看到 sort 可以作为参数发挥排序作用。实际上 sort 可以类似计数方法一样直接跟在查询的后面:
- results = collection.find({'text' : 'Hello World'}).sort('name', pymongo.ASCENDING)
- print([result['name'] for result in results])
十、索引
10.1 创建索引
在插入数据时,已经有一个 _id 索引了,但我们还可以自定义创建索引:
- collection.create_index('name', unique= True)
10.2 获取索引信息
可以利用 index_information 获取索引介绍:
- index_info = collection.index_information()
- print(index_info)
10.3 删除索引
- del_index = collection.drop_index(index_name)
以上就是一些 Python 操作 MongoDB的基本用法,更多关于 PyMongo 的详细用法,可以自行查阅官方文档。