Bootstrap

高仿瑞幸小程序 09 云数据库初体验

在上一节,我们创建了第一个云函数,在这一节,我们来一起学习一下云数据库的使用。当我们学会了小程序界面的绘制,逻辑的编码,云函数的编写,云数据库的使用,我们会变成什么?变成一个什么都会做的全栈工程师,由于我们什么都会做。所以我们什么都要做,于是时间就不够啦,就要开始996,然后007,这是福报,马爸爸说的。

开个玩笑啦,我们先成为全栈工程师,然后目标是成为一个10x程序猿。随着能力的提高,升职加薪是必然的。小程序的流行势不可挡,它还没有停止进化,当我们一个人就可以快速的完成一个小程序的开发时,我们就可以依靠个人力量去做一些产品,万一这个产品火爆了呢?没准就实现财务自由了。这是一个很美好的梦想对不对?马爸爸也说过,人总是要有梦想的,万一实现了呢?如果马爸爸没说过,那就算作我说的。

好了,废话不多说,今天我们一起来学习以下三块内容:

1 创建集合

2 添加记录

3 云函数读取云数据库

一 创建集合

集合的概念,顾名思义,就是同类数据的集合。例如我们有个产品的集合里面放的都是产品的数据。我们的“为你推荐”模块就是从产品集合里面随机读取4条数据。

我们先来看看在开发者工具中如何创建集合。首先,点击“云开发” 

然后点击“数据库”,并通过点击“+”号,创建集合。 

在弹出的窗口中输入集合的名称,这里我们输入products: 

点击“确定”,我们就能在左侧看到我们创建的集合了。

二 添加记录

接下里我们来添加记录,先点击我们的集合“products”,再点击“添加记录按钮”。

在弹出窗口,我们可以通过加号按钮添加该条记录的属性及值。 

我们以添加产品名为例。字段名输入“name”,类型选择string,值输入“陨石拿铁”。

对于我们来讲,一条产品的记录光有name是不够的。一共有以下这几个字段:

name:产品名

nPrice:折后价格

oPrice:原始价格

thum:产品缩略图

image:产品大图

categoryId:产品分类id

其中image和categoryId暂时用不着,但我们预留着。

除了手动一条一条的添加记录之外,我们还可以批量导入数据。在我们点击集合名称“products”之后,我们选择“导入”按钮 

在打开的窗口中点击“选择文件”, 

找到我们的json文件(该文件我会在源代码中提供):

完成导入后我们就能看到我们导入的数据了: 

我们来简单分析一下导入的数据。也就是我们的products.json文件。它虽然是以json结尾,但是又和我们平时接触的json不太一样。那我们就来做一个对比。普通的json文件如下

[

  {name:”拿铁”},

  {name:”陨石拿铁”}

]

我们可以看到中括号清晰的表示这是一个数组,数组内的每条记录之间还有逗号“,”相隔。

而云数据库中的集合用的是jsonline格式如下:

{name:”拿铁”}

{name:”陨石拿铁”}

数据外面没有中括号,记录之间也没有逗号“,”相隔。接下来,我们就要进入编码环节了。

三 云函数读取云数据库

接下来,我们要改造之前的云函数,将里面写死的数据,改成随机从数据库中读取。

我们打开“cloudfunctions/client_home_get_best/index.js”文件。在第四行添加两行代码:

const db = cloud.database()

const products = db.collection("products")

这两行代码什么意思呢?第一行,是用一个常量db表示我们对数据库的引用。接着再声明一个常量product表示我们对创建的集合“products”的引用。这样,我们就能通过products对产品数据进行操作了。

接下来,我们要实现的是,随机读取4条记录。

 const data = await products

    .aggregate()

    .sample({

      size: 4

    })

    .end()

我们一行一行的解释,第一行,我们要注意到一个关键字“await”,这表示我们的数据读取是同步的,为什么要这么做呢?因为数据库的操作默认是异步的。如果我们不改成同步的,那么我们在获取数据之前,云函数就直接返回结果了,那我们就什么数据都拿不到了。所以,关键字await是必须的。

第二行 aggregate(),这表示我们要对集合进行聚合操作。 聚合操作能对记录进行一些复杂的处理,例如随机挑选数据。它通常end()做结束。

而第三行sample就是我们这次的关键了,它接收的参数size就表示是随机取出记录的数量。

data是我们拿到的数据,但是data里面的list才是我们所要的,所以返回的时候要这么写:

return {
    ……
    data: data.list,
  }

最后来看看完整的代码:

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const products = db.collection("products")
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  const status = "success"
  const msg = ""
  const data = await products
    .aggregate()
    .sample({
      size: 4
    })
    .end()
    console.log(data)
  return {
    status: status,
    msg: msg,
    data: data.list,
  }
}

当我们写完index.js的代码,记得要将云函数的代码上传到云服务器上。怎么做呢?如下:

完整代码我放在了github上,地址是:

https://github.com/gogoswift/luckin

这个系列的文章列表