Python代码中操作mongoDB
前言
上一章节我们已经学习了mongoDB的常见命令,接下来我们继续学习在Python代码中实际操作mongoDB。常见的库有PyMongo,mongoengine。PyMong提供的相关API与原生命令基本一致,我们只做简单的介绍基本流程。
重点学习mongoengine,这是一个ODM方式的库,本质是在PyMong的基础上进行了封装,所以在使用mongoengine的时候除了引入自己的库以外还需要引入对应版本的PyMong库。他们的关系类似mysqlclient与Django的模型模块。
PyMong
PyMong相关API的使用与原生命令很类似。
准备工作:
$ pip install pymongo
代码演示:
import pymongo
#通过MongoClient链接到mongodb,参数分别为ip和端口号,默认为27017
client = pymongo.MongoClient(host='localhost', port=27017)
#指定数据库,dbname是某个数据库的名称
db=client.dbname
#指定数据库中的某个集合,也可以一步获取,colloection=client.dbname.mycol
colloection=db.mycol
student = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
#调用insert_one插入单个数据,3版本之后mongodb不再推荐insert
collection.insert_one(student)
#查询
rs = collection.find_one({'name':'Jordan'})
#打印数据
print(rs)
通过代码确实发现了使用方式与原生API类似,如果在开发中直接使用PyMong的同学可以搜索更多命令学习。
mongoengine
mongoengine简介
MongoEngine是一个对象文档映射器(ODM),相当于一个基于SQL的对象关系映射器(ORM),MongoEngine提供的抽象是基于类的,创建的所有模型都是类。只要对比着ORM学习mongoengine是一件比较轻松的事情,实际开发中mongoengine经常集成到Django或者Flask环境中使用。我们当前以Django为例,Flask使用类似。
Django并不原生支持Mongodb,使用mongoengine包,其提供与Django基本一致的ORM操作。
mongoengine在Django中的使用流程
安装模块:
mongoengine依赖pymongo库。
pip install pymongo
pip install mongoengine
配置settings
Django的settings.py文件中添加配置:
#如果新建了应用,别忘记将应用配置到INSTALLED_APPS中
#需要配置多数据库
DATABASES = {
#mysql配置
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djanggo',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '111.231.239.236',
'PORT': "3306"
},
#mongodb
'mongodb': {
'ENGINE': 'django.db.backends.dummy',
#设置为None测试也可以 'ENGINE': None,
}
}
#mongoengine配置
from mongoengine import connect
connect('dbname', host='127.0.0.1')#test是数据库名称,如果是本机可以省略host参数
创建Model类
根据mondodb中文档要保存的数据结构创建模型类,并继承与mongoengine.Document
定义的类名就是collection名。类中定义filed域,与定义关系型数据库的表和表字段一样。
class Student(mongoengine.Document):
name = mongoengine.StringField(max_length=30, required=True)
age = mongoengine.IntField(default=23, null=True)
无需makemigrations和migrate,直接就能够使用。
测试
在应用的tests.py文件或者通过python manage.py shell进入的命令行中
from .models import Student
stu = Student(name="pfdu",age=10)
stu.save()
# Student.objects.create(name="pfdu",age=10)均可,进一步证明了mongoengine的使用与django的orm的一致
mongoengine细节
我们发现mongoengine的使用django的orm基本一致,比如创建模型,增删改查的api等,如果不熟悉可以查看之前的博客.
但是他们毕竟不属于同一种技术,所以还是一些细节的区别,主要在字段的类型。
filed类型
mongoengine提供的类型
- BinaryField
- BooleanField
- ComplexDateTimeField
- DateTimeField
- DecimalField
- DictField
- DynamicField
- EmailField
- EmbeddedDocumentField
- EmbeddedDocumentListField
- FileField
- FloatField
- GenericEmbeddedDocumentField
- GenericReferenceField
- GeoPointField
- ImageField
- IntField
- ListField
- MapField
- ObjectIdField
- ReferenceField
- SequenceField
- SortedListField
- StringField
- URLField
- UUIDField
- PointField
- LineStringField
- PolygonField
- MultiPointField
- MultiLineStringField
- MultiPolygonField
类型众多,我们着重介绍其中黑体部分的类型。
类型是为了域保存的数据而设置的,而域又是文档的组成部分。为了方便学习我们回顾上一章节中的一句话:MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
那我们就思考下,你经常使用的json对象的格式是什么样子的,然后根据常见的json格式去上面的列表中寻找你所需要掌握的字段类型。
#比如用一个json对象表示一个学生如下:
{
"name": "pfdu", #StringField(max_length=20, required=True)
"age": 20, #IntField(default=0)
"fav": ["游泳", "看书", "足球"], # ListField(StringField(max_length=20, required=True))爱好是一个列表,列表中的每个选项是字符串
"friends": [{ #学生对象中包含一个好友列表,列表中是另一个好友对象,ListField(ReferenceField(Friend))
"name": "zhangsan",
"age": 22
}, {
"name": "lisi",
"age": 22
}],
"teacher": { #学生对象中包含了一个教师对象,这里需要使用 ReferenceField(Teacher) ,Teacher是另一个模型类
"name": "wangwu",
"age": 50,
"grade": "English"
},
"score": { #成绩是一个字典,成绩不确定。可以使用DictField()适用于有时你不会知道你想要存储的结构。
"tiyu": 90,
"yuwen": 80
}
}
总结
在实际公司里直接使用PyMong或者mongoengine的都有。mongoengine封装性强,与orm语法保持一致,但是学习成本较高。PyMong直接在代码中书写命令形态的代码不够面向对象,但是简便。