补充第9个视频文档-设备管理模块之MongoDB开发

本次课讲解设备向上的数据通道数据存储,我们采用MongoDB存储向上的数值型数据。这次课需要准备MongoDB数据库,Django如何集成和使用MongoDB,如何序列化以及如何写视图函数。Django采用mysql数据库和MongoDB是有差异的,我们首先讲解MongoDB,MongoDB的python引擎mongoengine,然后再讲解具体的开发。

MongoDB

安装MongoDB,笔者在Mac上安装,大家如果使用windows可以参考网上文档(https://www.runoob.com/mongodb/mongodb-osx-install.html),有各种平台的安装说明,这个不影响代码。

Mac OSX 平台安装 MongoDB

MongoDB 提供了 OSX 平台上 64 位的安装包,你可以在官网下载安装包。

下载地址:https://www.mongodb.com/download-center#community

接下来我们使用 curl 命令来下载安装:

安装完成后,我们可以把 MongoDB 的二进制命令文件目录(安装目录/bin)添加到 PATH 路径中:

export PATH=/usr/local/mongodb/bin:$PATH

创建日志及数据存放的目录:

  • 数据存放路径:

    sudo mkdir -p /usr/local/var/mongodb

  • 日志文件路径:

    sudo mkdir -p /usr/local/var/log/mongodb

接下来要确保当前用户对以上两个目录有读写的权限:

sudo chown runoob /usr/local/var/mongodb
sudo chown runoob /usr/local/var/log/mongodb

以上 runoob 是我电脑上对用户,你这边需要根据你当前对用户名来修改。

接下来我们使用以下命令在后台启动 mongodb:

mongod –dbpath /usr/local/var/mongodb –logpath /usr/local/var/log/mongodb/mongo.log –fork

  • –dbpath 设置数据存放目录

  • –logpath 设置日志存放目录

  • –fork 在后台运行

如果不想在后端运行,而是在控制台上查看运行过程可以直接设置配置文件启动:

mongod –config /usr/local/etc/mongod.conf

查看 mongod 服务是否启动:

ps aux | grep -v grep | grep mongod

使用以上命令如果看到有 mongod 的记录表示运行成功。

启动后我们可以使用 mongo 命令打开一个终端:

$ cd /usr/local/mongodb/bin
$ ./mongo
MongoDB shell version v4.0.9
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { “id” : UUID(“3c12bf4f-695c-48b2-b160-8420110ccdcf”) }
MongoDB server version: 4.0.9
……
> 1 + 1
2
>

使用 brew 安装(略)

MongoDB简单操作

建议大家看一下网上的操作文档。

下表将帮助您更容易理解Mongo中的一些概念:

SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB不支持primary keyprimary key主键,MongoDB自动将_id字段设置为主键

数据库

一个mongodb中可以建立多个数据库。

MongoDB的默认数据库为”db”,该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

“show dbs” 命令可以显示所有数据的列表。

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> show dbs
local  0.078GB
test   0.078GB
>

执行 “db” 命令可以显示当前数据库对象或集合。

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> db
test
>

运行”use”命令,可以连接到一个指定的数据库。

> use local
switched to db local
> db
local
>

以上实例命令中,”local” 是你要链接的数据库。

文档(Document)

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的文档例子如下:

{“site”:”www.runoob.com”, “name”:”菜鸟教程”}

下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMSMongoDB数据库数据库表格集合行文档列字段表联合嵌入文档主键主键 (MongoDB 提供了 key 为 _id )数据库服务和客户端Mysqld/Oraclemongodmysql/sqlplusmongo

需要注意的是:

  1. 文档中的键/值对是有序的。

  2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。

  3. MongoDB区分类型和大小写。

  4. MongoDB的文档不能有重复的键。

  5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  • 键不能含有\0 (空字符)。这个字符用来表示键的结尾。

  • .和$有特别的意义,只有在特定环境下才能使用。

  • 以下划线”_”开头的键是保留的(不是严格要求的)。

集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

比如,我们可以将以下不同数据结构的文档插入到集合中:

{“site”:”www.baidu.com”}
{“site”:”www.google.com”,”name”:”Google”}
{“site”:”www.runoob.com”,”name”:”菜鸟教程”,”num”:5}

当第一个文档插入时,集合就会被创建。

MongoDB 创建数据库

语法

MongoDB 创建数据库的语法格式如下:

use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

实例

以下实例我们创建了数据库 runoob:

> use runoob
switched to db runoob
> db
runoob
>

如果你想查看所有数据库,可以使用 show dbs 命令:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
>

可以看到,我们刚创建的数据库 runoob 并不在数据库的列表中, 要显示它,我们需要向 runoob 数据库插入一些数据。

> db.runoob.insert({“name”:”菜鸟教程”})
WriteResult({ “nInserted” : 1 })
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
runoob  0.000GB

MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。

MongoDB 其他数据库操作

包括创建集合、删除集合、插入文档、删除文档等,大家在网上看一下,这里不详细讲述了。

mongoengine

我们使用Django操作MongoDB,需要mongoengine,MongoEngine由Python语言写成,提供一个很类似Django ORM的API 用于访问 MongoDB数据库。

安装:

创建数据通道

models:

admin:

serializers:

views:

urls:

device_router.register(r’datachannels’, DataChannelViewSet, base_name=’datachannels’)

数据库创建:

sh-3.2# python3 manage.py makemigrations device
Migrations for ‘device’:
 device/migrations/0002_datachannel.py
   – Create model DataChannel
sh-3.2# python3 manage.py migrate
Operations to perform:
 Apply all migrations: account, accounts, admin, auth, authtoken, contenttypes, device, devtemplate, sessions, sites
Running migrations:
 Applying device.0002_datachannel… OK

采用MongoDB存储上传数据

settings:

models:

serializers:

views:

urls:

资源下载: