经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python操作MongoDB文档数据库
来源:cnblogs  作者:wefeng  时间:2019/9/11 8:46:24  对本文有异议

1.Pymongo 安装

  1. 安装pymongo
  2. pip install pymongo
  • PyMongo是驱动程序,使python程序能够使用Mongodb数据库,使用python编写而成;

2.Pymongo 方法

  • insert_one():插入一条记录;
  • insert():插入多条记录;
  • find_one():查询一条记录,不带任何参数返回第一条记录,带参数则按条件查找返回;
  • find():查询多条记录,不带参数返回所有记录,带参数按条件查找返回;
  • count():查看记录总数;
  • create_index():创建索引;
  • update_one():更新匹配到的第一条数据;
  • update():更新匹配到的所有数据;
  • remove():删除记录,不带参表示删除全部记录,带参则表示按条件删除;
  • delete_one():删除单条记录;
  • delete_many():删除多条记录;

3.Pymongo 中的操作

  • 查看数据库
  1. from pymongo import MongoClient
  2. connect = MongoClient(host='localhost', port=27017, username="root", password="123456")
  3. connect = MongoClient('mongodb://localhost:27017/', username="root", password="123456")
  4. print(connect.list_database_names())
  • 获取数据库实例
  1. test_db = connect['test']
  • 获取collection实例
  1. collection = test_db['students']
  • 插入一行document, 查询一行document,取出一行document的值
  1. from pymongo import MongoClient
  2. from datetime import datetime
  3. connect = MongoClient(host='localhost', port=27017, username="root", password="123456",)
  4. # 获取db
  5. test_db = connect['test']
  6. # 获取collection
  7. collection = test_db['students']
  8. # 构建document
  9. document = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.now()}
  10. # 插入document
  11. one_insert = collection.insert_one(document=document)
  12. print(one_insert.inserted_id)
  13. # 通过条件过滤出一条document
  14. one_result = collection.find_one({"author": "Mike"})
  15. # 解析document字段
  16. print(one_result, type(one_result))
  17. print(one_result['_id'])
  18. print(one_result['author'])
  19. 注意:如果需要通过id查询一行document,需要将id包装为ObjectId类的实例对象
  20. from bson.objectid import ObjectId
  21. collection.find_one({'_id': ObjectId('5c2b18dedea5818bbd73b94c')})
  • 插入多行documents, 查询多行document, 查看collections有多少行document
  1. from pymongo import MongoClient
  2. from datetime import datetime
  3. connect = MongoClient(host='localhost', port=27017, username="root", password="123456",)
  4. # 获取db
  5. test_db = connect['test']
  6. # 获取collection
  7. collection = test_db['students']
  8. documents = [{"author": "Mike","text": "Another post!","tags": ["bulk", "insert"], "date": datetime(2009, 11, 12, 11, 14)},
  9. {"author": "Eliot", "title": "MongoDB is fun", "text": "and pretty easy too!", "date": datetime(2009, 11, 10, 10, 45)}]
  10. collection.insert_many(documents=documents)
  11. # 通过条件过滤出多条document
  12. documents = collection.find({"author": "Mike"})
  13. # 解析document字段
  14. print(documents, type(documents))
  15. print('*'*300)
  16. for document in documents:
  17. print(document)
  18. print('*'*300)
  19. result = collection.count_documents({'author': 'Mike'})
  20. print(result)
  • 范围比较查询
  1. from pymongo import MongoClient
  2. from datetime import datetime
  3. connect = MongoClient(host='localhost', port=27017, username="root", password="123456",)
  4. # 获取db
  5. test_db = connect['test']
  6. # 获取collection
  7. collection = test_db['students']
  8. # 通过条件过滤时间小于datetime(2019, 1,1,15,40,3) 的document
  9. documents = collection.find({"date": {"$lt": datetime(2019, 1,1,15,40,3)}}).sort('date')
  10. # 解析document字段
  11. print(documents, type(documents))
  12. print('*'*300)
  13. for document in documents:
  14. print(document)
  • 创建索引
  1. from pymongo import MongoClient
  2. import pymongo
  3. from datetime import datetime
  4. connect = MongoClient(host='localhost', port=27017, username="root", password="123456",)
  5. # 获取db
  6. test_db = connect['test']
  7. # 获取collection
  8. collection = test_db['students']
  9. # 创建字段索引
  10. collection.create_index(keys=[("name", pymongo.DESCENDING)], unique=True)
  11. # 查询索引
  12. result = sorted(list(collection.index_information()))
  13. print(result)
  • document修改
  1. from pymongo import MongoClient
  2. connect = MongoClient(host='localhost', port=27017, username="root", password="123456",)
  3. # 获取db
  4. test_db = connect['test']
  5. # 获取collection
  6. collection = test_db['students']
  7. result = collection.update({'name': 'robby'}, {'$set': {"name": "Petter"}})
  8. print(result)
  9. 注意:还有update_many()方法
  • document删除
  1. from pymongo import MongoClient
  2. connect = MongoClient(host='localhost', port=27017, username="root", password="123456",)
  3. # 获取db
  4. test_db = connect['test']
  5. # 获取collection
  6. collection = test_db['students']
  7. result = collection.delete_one({'name': 'Petter'})
  8. print(result.deleted_count)
  9. 注意:还有delete_many()方法

4.MongoDB ODM 详解

  • MongoDB ODM 与 Django ORM使用方法类似;
  • MongoEngine是一个对象文档映射器,用Python编写,用于处理MongoDB;
  • MongoEngine提供的抽象是基于类的,创建的所有模型都是类;
  1. # 安装mongoengine
  2. pip install mongoengine
  • mongoengine使用的字段类型
  1. BinaryField
  2. BooleanField
  3. ComplexDateTimeField
  4. DateTimeField
  5. DecimalField
  6. DictField
  7. DynamicField
  8. EmailField
  9. EmbeddedDocumentField
  10. EmbeddedDocumentListField
  11. FileField
  12. FloatField
  13. GenericEmbeddedDocumentField
  14. GenericReferenceField
  15. GenericLazyReferenceField
  16. GeoPointField
  17. ImageField
  18. IntField
  19. ListField:可以将自定义的文档类型嵌套
  20. MapField
  21. ObjectIdField
  22. ReferenceField
  23. LazyReferenceField
  24. SequenceField
  25. SortedListField
  26. StringField
  27. URLField
  28. UUIDField
  29. PointField
  30. LineStringField
  31. PolygonField
  32. MultiPointField
  33. MultiLineStringField
  34. MultiPolygonField

5.使用mongoengine创建数据库连接

  1. from mongoengine import connect
  2. conn = connect(db='test', host='localhost', port=27017, username='root', password='123456', authentication_source='admin')
  3. print(conn)

connect(db = None,alias ='default',** kwargs );

  • db:要使用的数据库的名称,以便与connect兼容;
  • host :要连接的mongod实例的主机名;
  • port :运行mongod实例的端口;
  • username:用于进行身份验证的用户名;
  • password:用于进行身份验证的密码;
  • authentication_source :要进行身份验证的数据库;

构建文档模型,插入数据

  1. from mongoengine import connect, Document, StringField, IntField, FloatField, ListField, EmbeddedDocumentField, DateTimeField, EmbeddedDocument
  2. from datetime import datetime
  3. # 嵌套文档
  4. class Score(EmbeddedDocument):
  5. name = StringField(max_length=50, required=True)
  6. value = FloatField(required=True)
  7. class Students(Document):
  8. choice = (('F', 'female'),
  9. ('M', 'male'),)
  10. name = StringField(max_length=100, required=True, unique=True)
  11. age = IntField(required=True)
  12. hobby = StringField(max_length=100, required=True, )
  13. gender = StringField(choices=choice, required=True)
  14. # 这里使用到了嵌套文档,这个列表中的每一个元素都是一个字典,因此使用嵌套类型的字段
  15. score = ListField(EmbeddedDocumentField(Score))
  16. time = DateTimeField(default=datetime.now())
  17. if __name__ == '__main__':
  18. connect(db='test', host='localhost', port=27017, username='root', password='123456', authentication_source='admin')
  19. math_score = Score(name='math', value=94)
  20. chinese_score = Score(name='chinese', value=100)
  21. python_score = Score(name='python', value=99)
  22. for i in range(10):
  23. students = Students(name='robby{}'.format(i), age=int('{}'.format(i)), hobby='read', gender='M', score=[math_score, chinese_score, python_score])
  24. students.save()

查询数据

  1. from mongoengine import connect, Document, StringField, IntField, FloatField, ListField, EmbeddedDocumentField, DateTimeField, EmbeddedDocument
  2. from datetime import datetime
  3. # 嵌套文档
  4. class Score(EmbeddedDocument):
  5. name = StringField(max_length=50, required=True)
  6. value = FloatField(required=True)
  7. class Students(Document):
  8. choice = (('F', 'female'),
  9. ('M', 'male'),)
  10. name = StringField(max_length=100, required=True, unique=True)
  11. age = IntField(required=True)
  12. hobby = StringField(max_length=100, required=True, )
  13. gender = StringField(choices=choice, required=True)
  14. # 这里使用到了嵌套文档,这个列表中的每一个元素都是一个字典,因此使用嵌套类型的字段
  15. score = ListField(EmbeddedDocumentField(Score))
  16. time = DateTimeField(default=datetime.now())
  17. if __name__ == '__main__':
  18. connect(db='test', host='localhost', port=27017, username='root', password='123456', authentication_source='admin')
  19. first_document = Students.objects.first()
  20. all_document = Students.objects.all()
  21. # 如果只有一条,也可以使用get
  22. specific_document = Students.objects.filter(name='robby3')
  23. print(first_document.name, first_document.age, first_document.time)
  24. for document in all_document:
  25. print(document.name)
  26. for document in specific_document:
  27. print(document.name, document.age)

修改、更新、删除数据

  1. from mongoengine import connect, Document, StringField, IntField, FloatField, ListField, EmbeddedDocumentField, DateTimeField, EmbeddedDocument
  2. from datetime import datetime
  3. # 嵌套文档
  4. class Score(EmbeddedDocument):
  5. name = StringField(max_length=50, required=True)
  6. value = FloatField(required=True)
  7. class Students(Document):
  8. choice = (('F', 'female'),
  9. ('M', 'male'),)
  10. name = StringField(max_length=100, required=True, unique=True)
  11. age = IntField(required=True)
  12. hobby = StringField(max_length=100, required=True, )
  13. gender = StringField(choices=choice, required=True)
  14. # 这里使用到了嵌套文档,这个列表中的每一个元素都是一个字典,因此使用嵌套类型的字段
  15. score = ListField(EmbeddedDocumentField(Score))
  16. time = DateTimeField(default=datetime.now())
  17. if __name__ == '__main__':
  18. connect(db='test', host='localhost', port=27017, username='root', password='123456', authentication_source='admin')
  19. specific_document = Students.objects.filter(name='robby3')
  20. specific_document.update(set__age=100)
  21. specific_document.update_one(set__age=100)
  22. for document in specific_document:
  23. document.name = 'ROBBY100'
  24. document.save()
  25. for document in specific_document:
  26. document.delete()
  • all():返回所有文档;
  • all_fields():包括所有字段;
  • as_pymongo():返回的不是Document实例 而是pymongo值;
  • average():平均值超过指定字段的值;
  • batch_size():限制单个批次中返回的文档数量;
  • clone():创建当前查询集的副本;
  • comment():在查询中添加注释;
  • count():计算查询中的选定元素;
  • create():创建新对象,返回保存的对象实例;
  • delete():删除查询匹配的文档;
  • distinct():返回给定字段的不同值列表;

嵌入式文档查询的方法

  • count():列表中嵌入文档的数量,列表的长度;
  • create():创建新的嵌入式文档并将其保存到数据库中;
  • delete():从数据库中删除嵌入的文档;
  • exclude(** kwargs ):通过使用给定的关键字参数排除嵌入的文档来过滤列表;
  • first():返回列表中的第一个嵌入文档;
  • get():检索由给定关键字参数确定的嵌入文档;
  • save():保存祖先文档;
  • update():使用给定的替换值更新嵌入的文档;

原文链接:http://www.cnblogs.com/wefeng/p/11503102.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号