MongoDB中不溜教程(2)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直接在代码中书写命令形态的代码不够面向对象,但是简便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值