浅析Python与Mongodb数据库之间的操作方法

时间:2022-11-03 19:20:47

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。

1. 安装Mongodb和pymongo

 

Mongodb的安装和配置

Mongodb的安装教程请网上搜索, 安装完成后,    进行以下配置过程:

1.1 创建目录, 该目录为Mongodb数据文件的存放目录:

*注: 本人使用的不是root用户, 所以修改目录的拥有者. *

  1. sudo mkdir /data
  2. sudo chown -R python:python /data
  3. mkdir /data/db

1.2 分别执行命令:

第一条命令为指定端口和保存路径, 第二条为运行mongodb数据库.

  1. mongod --port 27017 --dbpath /data/db
  2. mongo --port 27017

1.3 安装pymongo

sudo pip3 install pymongo

2. 连接数据库、指定数据库、指定集合、插入数据:

 

mongodb存储数据以键值形式, 因此在Python中使用字段插入数据.

  1. import pymongo
  2. #连接mongodb
  3. client = pymongo.MongoClient('mongodb://localhost:27017/')
  4. #指定数据库
  5. db = client.test4
  6. #指定集合
  7. collection = db.students
  8. #数据
  9. student1 = {
  10. 'id': '201801',
  11. 'name': 'Jack',
  12. 'age': 20,
  13. 'gender': 'male'
  14. }
  15. student2 = {
  16. 'id': '201802',
  17. 'name': 'Tom',
  18. 'age': 22,
  19. 'gender': 'male'
  20. }
  21. student3 = {
  22. 'id': '201803',
  23. 'name': 'Rose',
  24. 'age': 21,
  25. 'gender': 'female'
  26. }
  27. student4 = {
  28. 'id': '201804',
  29. 'name': 'Mike',
  30. 'age': 20,
  31. 'gender': 'female'
  32. }
  33. student5 = {
  34. 'id': '201805',
  35. 'name': 'Ray',
  36. 'age': 20,
  37. 'gender': 'female'
  38. }
  39. student6 = {
  40. 'id': '201806',
  41. 'name': 'Alan',
  42. 'age': 21,
  43. 'gender': 'male'
  44. }
  45. #插入一条数据
  46. result1 = collection.insert_one(student1)
  47. print(result1)
  48. print(result1.inserted_id)
  49. # #插入多条数据
  50. result2 = collection.insert_many([student2, student3, student4, student5, student6])
  51. print(result2)
  52. print(result2.inserted_ids)

运行结果:

insert方法:

5b3a1942971951218d41c02b
[ObjectId('5b3a1942971951218d41c02c'), ObjectId('5b3a1942971951218d41c02d')]

官方推荐:

  1. <pymongo.results.InsertOneResult object at 0x7fa4cc363ec8>
  2. 5b3a1942971951218d41c02e
  3. <pymongo.results.InsertManyResult object at 0x7fa4cc363f08>
  4. [ObjectId('5b3a1942971951218d41c02f'), ObjectId('5b3a1942971951218d41c030')]

3. 查询、计数、排序、偏移:

 

  1. import pymongo
  2. from bson.objectid import ObjectId
  3. client = pymongo.MongoClient('mongodb://localhost:27017/')
  4. db = client.test4
  5. collection = db.students
  6. #查询一条数据
  7. print('单条数据','='*50)
  8. result = collection.find_one({'name': 'Jack'})
  9. print(result)
  10. print('多条数据','='*50)
  11. #查询多条数据
  12. for res in collection.find({'age': {'$mod': [5, 0]}}):
  13. print(res)
  14. #计数
  15. print('计数','='*50)
  16. count = collection.find({'age': {'$mod': [5, 0]}}).count()
  17. print(count)
  18. #排序
  19. print('排序','='*50)
  20. results = collection.find().sort('name', pymongo.ASCENDING) #升序, pymongo.DESCENDING为降序
  21. print([result['name'] for result in results])
  22. #偏移
  23. print('偏移','='*50)
  24. results = collection.find().sort('name', pymongo.ASCENDING).skip(2) #偏移2位,忽略前两个数据
  25. print([result['name'] for result in results])
  26. results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2) #只输出2个数据
  27. print([result['name'] for result in results])
  28. find({‘age': {'$mod': [5, 0]}}): 表示查找年龄取余5余0的值. 还有很多比较符号, 请百度.

运行结果:

  1. 单条数据 ==================================================
  2. {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
  3. 多条数据 ==================================================
  4. {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
  5. {'_id': ObjectId('5b3a1942971951218d41c02e'), 'id': '201804', 'name': 'Mike', 'age': 20, 'gender': 'female'}
  6. {'_id': ObjectId('5b3a1942971951218d41c02f'), 'id': '201805', 'name': 'Ray', 'age': 20, 'gender': 'female'}
  7. 计数 ==================================================
  8. 3
  9. 排序 ==================================================
  10. ['Alan', 'Jack', 'Mike', 'Ray', 'Rose', 'Tom']
  11. 偏移 ==================================================
  12. ['Mike', 'Ray', 'Rose', 'Tom']
  13. ['Mike', 'Ray']

4. 更新:

 

4.1  不使用$set更新数据:

  1. import pymongo
  2. from bson.objectid import ObjectId
  3. client = pymongo.MongoClient('mongodb://localhost:27017/')
  4. db = client.test4
  5. collection = db.students
  6. #修改
  7. condition = {'name': 'Jack'}
  8. student = collection.find_one(condition) #获得满足condition的数据
  9. print('更新前: ', student)
  10. student['age'] = 22 #修改年龄
  11. result = collection.update(condition, student) #将修改后的student替换condition
  12. print('更新后', collection.find_one(condition))
  13. #更新的返回值
  14. print(result) #ok=1代表执行成功, nModified代表影响的条数

运行结果:

  1. 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
  2. 更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}
  3. {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

4.2  使用$set更新数据:

  1. import pymongo
  2. from bson.objectid import ObjectId
  3. client = pymongo.MongoClient('mongodb://localhost:27017/')
  4. db = client.test4
  5. collection = db.students
  6. #使用$set更新
  7. condition = {'name': 'Jack'}
  8. student = collection.find_one(condition) #获得满足condition的数据
  9. print('更新前: ', student)
  10. student['age'] = 23 #修改年龄
  11. result = collection.update(condition, {'$set': student}) #将修改后的student替换condition, $set为重点
  12. print('更新后', collection.find_one(condition))
  13. #更新的返回值
  14. print(result) #ok=1代表执行成功, nModified代表影响的条数

运行结果:

  1. 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}
  2. 更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}
  3. {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

比较使用和不适用$set更新数据, 发现此时并没有什么区别.

下面介绍区别所在:

4.3  区别

  1. import pymongo
  2. from bson.objectid import ObjectId
  3. client = pymongo.MongoClient('mongodb://localhost:27017/')
  4. db = client.test4
  5. collection = db.students
  6. #使用和不使用$set更新的区别
  7. print('使用: ')
  8. condition = {'name': 'Jack'}
  9. student = collection.find_one(condition) #获得满足condition的数据
  10. print('更新前: ', student)
  11. student = {
  12. 'id': '201803',
  13. 'name': 'Jack',
  14. 'age': 20,
  15. 'gender': 'female',
  16. 'mother': "Jack's mother"
  17. }
  18. result = collection.update(condition, {'$set': student}) #将修改后的student替换condition
  19. print('更新后', collection.find_one(condition))
  20. #更新的返回值
  21. print(result) #ok=1代表执行成功, nModified代表影响的条数
  22. #分割线
  23. print()
  24. print('='*20, '分割线', '='*20)
  25. print()
  26. print('不使用: ')
  27. condition = {'name': 'Jack'}
  28. student = collection.find_one(condition) #获得满足condition的数据
  29. print('更新前: ', student)
  30. student = {
  31. 'id': '201803',
  32. 'name': 'Jack',
  33. 'age': 20,
  34. 'gender': 'female',
  35. 'father': "Jack's father"
  36. }
  37. result = collection.update(condition, student) #将修改后的student替换condition
  38. print('更新后', collection.find_one(condition))
  39. #更新的返回值
  40. print(result) #ok=1代表执行成功, nModified代表影响的条数

运行结果:

使用:

  1. 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}
  2. 更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}
  3. {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

==================== 分割线 ====================

  1. 不使用:
  2. 更新前: {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}
  3. 更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'father': "Jack's father"}
  4. {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

分析上面运行结果, 可以发现使用$set时, 若更新数据有原数据没有的字段, 则将该字段加到原数据上(上例为新增了mother字段), 而不会删除任何字段. 相反, 若不使用set时, 将从原数据中删除更新数据没有的字段, 再加上新增字段(上例为删除了mother字段, 新增了father字段. 也可以理解为将原数据完全替换为更新数据)

4.4  update_one和update_many的区别:

  1. import pymongo
  2. from bson.objectid import ObjectId
  3. client = pymongo.MongoClient('mongodb://localhost:27017/')
  4. db = client.test4
  5. collection = db.students
  6. #官方推荐使用
  7. #update_one和update_many的区别
  8. print('update_one: ')
  9. condition = {'age': {'$gt': 20}}
  10. result = collection.update_one(condition, {'$inc': {'age': 1}})
  11. print(result)
  12. print(result.matched_count, result.modified_count)
  13. #分割线
  14. print()
  15. print('='*20, '分割线', '='*20)
  16. print()
  17. print('update_many: ')
  18. condition = {'age': {'$gt': 20}}
  19. result = collection.update_many(condition, {'$inc': {'age': 1}})
  20. print(result)
  21. print(result.matched_count, result.modified_count)

运行结果:

  1. update_one:
  2. <pymongo.results.UpdateResult object at 0x7f6cace0f9c8>
  3. 1 1
  4. ==================== 分割线 ====================
  5. update_many:
  6. <pymongo.results.UpdateResult object at 0x7f6cace0fa88>
  7. 3 3
  8. 12345678910
  9. {‘age': {'$gt': 20}}为查找年龄大于20的, {‘inc': {‘age': 1}}为将年龄+1

5. 删除:

 

  1. import pymongo
  2. from bson.objectid import ObjectId
  3. client = pymongo.MongoClient('mongodb://localhost:27017/')
  4. db = client.test4
  5. collection = db.students
  6. #删除
  7. result = collection.remove({'name': 'Jack'})
  8. print(result)
  9. #推荐使用
  10. result = collection.delete_one({'age': {'$gt': 20}})
  11. print(result.deleted_count)
  12. result = collection.delete_many({'age': {'$gt': 20}})
  13. print(result.deleted_count)

运行结果:

{'ok': 1, 'n': 1}
1
2

6. 其他

 

除了上述常用的之外, 还包括find_one_and_delete()查找后删除、find_one_and_replace()查找后替换, 有兴趣可以百度深入了解.

总结

以上所述是小编给大家介绍的Python与Mongodb数据库之间的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!