MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。
1. 安装Mongodb和pymongo
Mongodb的安装和配置
Mongodb的安装教程请网上搜索, 安装完成后, 进行以下配置过程:
1.1 创建目录, 该目录为Mongodb数据文件的存放目录:
*注: 本人使用的不是root用户, 所以修改目录的拥有者. *
- sudo mkdir /data
- sudo chown -R python:python /data
- mkdir /data/db
1.2 分别执行命令:
第一条命令为指定端口和保存路径, 第二条为运行mongodb数据库.
- mongod --port 27017 --dbpath /data/db
- mongo --port 27017
1.3 安装pymongo
sudo pip3 install pymongo
2. 连接数据库、指定数据库、指定集合、插入数据:
mongodb存储数据以键值形式, 因此在Python中使用字段插入数据.
- import pymongo
- #连接mongodb
- client = pymongo.MongoClient('mongodb://localhost:27017/')
- #指定数据库
- db = client.test4
- #指定集合
- collection = db.students
- #数据
- student1 = {
- 'id': '201801',
- 'name': 'Jack',
- 'age': 20,
- 'gender': 'male'
- }
- student2 = {
- 'id': '201802',
- 'name': 'Tom',
- 'age': 22,
- 'gender': 'male'
- }
- student3 = {
- 'id': '201803',
- 'name': 'Rose',
- 'age': 21,
- 'gender': 'female'
- }
- student4 = {
- 'id': '201804',
- 'name': 'Mike',
- 'age': 20,
- 'gender': 'female'
- }
- student5 = {
- 'id': '201805',
- 'name': 'Ray',
- 'age': 20,
- 'gender': 'female'
- }
- student6 = {
- 'id': '201806',
- 'name': 'Alan',
- 'age': 21,
- 'gender': 'male'
- }
- #插入一条数据
- result1 = collection.insert_one(student1)
- print(result1)
- print(result1.inserted_id)
- # #插入多条数据
- result2 = collection.insert_many([student2, student3, student4, student5, student6])
- print(result2)
- print(result2.inserted_ids)
运行结果:
insert方法:
5b3a1942971951218d41c02b
[ObjectId('5b3a1942971951218d41c02c'), ObjectId('5b3a1942971951218d41c02d')]
官方推荐:
- <pymongo.results.InsertOneResult object at 0x7fa4cc363ec8>
- 5b3a1942971951218d41c02e
- <pymongo.results.InsertManyResult object at 0x7fa4cc363f08>
- [ObjectId('5b3a1942971951218d41c02f'), ObjectId('5b3a1942971951218d41c030')]
3. 查询、计数、排序、偏移:
- import pymongo
- from bson.objectid import ObjectId
- client = pymongo.MongoClient('mongodb://localhost:27017/')
- db = client.test4
- collection = db.students
- #查询一条数据
- print('单条数据','='*50)
- result = collection.find_one({'name': 'Jack'})
- print(result)
- print('多条数据','='*50)
- #查询多条数据
- for res in collection.find({'age': {'$mod': [5, 0]}}):
- print(res)
- #计数
- print('计数','='*50)
- count = collection.find({'age': {'$mod': [5, 0]}}).count()
- print(count)
- #排序
- print('排序','='*50)
- results = collection.find().sort('name', pymongo.ASCENDING) #升序, pymongo.DESCENDING为降序
- print([result['name'] for result in results])
- #偏移
- print('偏移','='*50)
- results = collection.find().sort('name', pymongo.ASCENDING).skip(2) #偏移2位,忽略前两个数据
- print([result['name'] for result in results])
- results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2) #只输出2个数据
- print([result['name'] for result in results])
- find({‘age': {'$mod': [5, 0]}}): 表示查找年龄取余5余0的值. 还有很多比较符号, 请百度.
运行结果:
- 单条数据 ==================================================
- {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
- 多条数据 ==================================================
- {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
- {'_id': ObjectId('5b3a1942971951218d41c02e'), 'id': '201804', 'name': 'Mike', 'age': 20, 'gender': 'female'}
- {'_id': ObjectId('5b3a1942971951218d41c02f'), 'id': '201805', 'name': 'Ray', 'age': 20, 'gender': 'female'}
- 计数 ==================================================
- 3
- 排序 ==================================================
- ['Alan', 'Jack', 'Mike', 'Ray', 'Rose', 'Tom']
- 偏移 ==================================================
- ['Mike', 'Ray', 'Rose', 'Tom']
- ['Mike', 'Ray']
4. 更新:
4.1 不使用$set更新数据:
- import pymongo
- from bson.objectid import ObjectId
- client = pymongo.MongoClient('mongodb://localhost:27017/')
- db = client.test4
- collection = db.students
- #修改
- condition = {'name': 'Jack'}
- student = collection.find_one(condition) #获得满足condition的数据
- print('更新前: ', student)
- student['age'] = 22 #修改年龄
- result = collection.update(condition, student) #将修改后的student替换condition
- print('更新后', collection.find_one(condition))
- #更新的返回值
- print(result) #ok=1代表执行成功, nModified代表影响的条数
运行结果:
- 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
- 更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}
- {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
4.2 使用$set更新数据:
- import pymongo
- from bson.objectid import ObjectId
- client = pymongo.MongoClient('mongodb://localhost:27017/')
- db = client.test4
- collection = db.students
- #使用$set更新
- condition = {'name': 'Jack'}
- student = collection.find_one(condition) #获得满足condition的数据
- print('更新前: ', student)
- student['age'] = 23 #修改年龄
- result = collection.update(condition, {'$set': student}) #将修改后的student替换condition, $set为重点
- print('更新后', collection.find_one(condition))
- #更新的返回值
- print(result) #ok=1代表执行成功, nModified代表影响的条数
运行结果:
- 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}
- 更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}
- {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
比较使用和不适用$set更新数据, 发现此时并没有什么区别.
下面介绍区别所在:
4.3 区别
- import pymongo
- from bson.objectid import ObjectId
- client = pymongo.MongoClient('mongodb://localhost:27017/')
- db = client.test4
- collection = db.students
- #使用和不使用$set更新的区别
- print('使用: ')
- condition = {'name': 'Jack'}
- student = collection.find_one(condition) #获得满足condition的数据
- print('更新前: ', student)
- student = {
- 'id': '201803',
- 'name': 'Jack',
- 'age': 20,
- 'gender': 'female',
- 'mother': "Jack's mother"
- }
- result = collection.update(condition, {'$set': student}) #将修改后的student替换condition
- print('更新后', collection.find_one(condition))
- #更新的返回值
- print(result) #ok=1代表执行成功, nModified代表影响的条数
- #分割线
- print()
- print('='*20, '分割线', '='*20)
- print()
- print('不使用: ')
- condition = {'name': 'Jack'}
- student = collection.find_one(condition) #获得满足condition的数据
- print('更新前: ', student)
- student = {
- 'id': '201803',
- 'name': 'Jack',
- 'age': 20,
- 'gender': 'female',
- 'father': "Jack's father"
- }
- result = collection.update(condition, student) #将修改后的student替换condition
- print('更新后', collection.find_one(condition))
- #更新的返回值
- print(result) #ok=1代表执行成功, nModified代表影响的条数
运行结果:
使用:
- 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}
- 更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}
- {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
==================== 分割线 ====================
- 不使用:
- 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}
- 更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'father': "Jack's father"}
- {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
分析上面运行结果, 可以发现使用$set时, 若更新数据有原数据没有的字段, 则将该字段加到原数据上(上例为新增了mother字段), 而不会删除任何字段. 相反, 若不使用set时, 将从原数据中删除更新数据没有的字段, 再加上新增字段(上例为删除了mother字段, 新增了father字段. 也可以理解为将原数据完全替换为更新数据)
4.4 update_one和update_many的区别:
- import pymongo
- from bson.objectid import ObjectId
- client = pymongo.MongoClient('mongodb://localhost:27017/')
- db = client.test4
- collection = db.students
- #官方推荐使用
- #update_one和update_many的区别
- print('update_one: ')
- condition = {'age': {'$gt': 20}}
- result = collection.update_one(condition, {'$inc': {'age': 1}})
- print(result)
- print(result.matched_count, result.modified_count)
- #分割线
- print()
- print('='*20, '分割线', '='*20)
- print()
- print('update_many: ')
- condition = {'age': {'$gt': 20}}
- result = collection.update_many(condition, {'$inc': {'age': 1}})
- print(result)
- print(result.matched_count, result.modified_count)
运行结果:
- update_one:
- <pymongo.results.UpdateResult object at 0x7f6cace0f9c8>
- 1 1
- ==================== 分割线 ====================
- update_many:
- <pymongo.results.UpdateResult object at 0x7f6cace0fa88>
- 3 3
- 12345678910
- {‘age': {'$gt': 20}}为查找年龄大于20的, {‘inc': {‘age': 1}}为将年龄+1
5. 删除:
- import pymongo
- from bson.objectid import ObjectId
- client = pymongo.MongoClient('mongodb://localhost:27017/')
- db = client.test4
- collection = db.students
- #删除
- result = collection.remove({'name': 'Jack'})
- print(result)
- #推荐使用
- result = collection.delete_one({'age': {'$gt': 20}})
- print(result.deleted_count)
- result = collection.delete_many({'age': {'$gt': 20}})
- print(result.deleted_count)
运行结果:
{'ok': 1, 'n': 1}
1
2
6. 其他
除了上述常用的之外, 还包括find_one_and_delete()查找后删除、find_one_and_replace()查找后替换, 有兴趣可以百度深入了解.
总结
以上所述是小编给大家介绍的Python与Mongodb数据库之间的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!