概述

最近更新时间:2020-09-16 17:31:19

云数据库是 CloudBase 提供的核心功能之一,提供基础读写、聚合搜索、数据库事务、实时推送等功能。

基础概念

记录(Record / Document)

云数据库是一种文档型数据库,数据库中的每条记录都是一个类似 JSON 格式的对象,例如:

{
  "name": "Tom",
  "age": 18,
  "location": {
    "country": "China",
    "province": "Guangdong",
    "city": "Shenzhen"
  }
}

集合(Collection)

集合由多条记录组成,任何记录必须从属于某个集合。

集合是读写操作的主要对象,每个集合都有一个集合名,如 usersarticles 等。

数据库(Database)

每个云开发环境下有且只有一个数据库实例,数据库实例中,可以创建多个集合。

调用方式

云数据库可以在用户端(如 Web 网页、小程序、Flutter)内调用,也可以在服务端(如服务器、云函数)内调用。

用户端调用

通过用户端调用时,需要先进行云开发的登录鉴权,然后以用户的身份进行数据库的读写操作。

说明:

用户端的代码是可能对外暴露的(例如 Web 网页),攻击者可能通过抓取、伪造请求的方式盗用或消耗您的 CloudBase 资源,所以我们提供了用户端上的登录鉴权机制来保护您的资源安全。

Web

const cloudbase = require("@cloudbase/js-sdk");

const app = cloudbase.init({
  env: "xxxx"
});

/**
  登录鉴权流程,此处代码略,请参考:
  https://cloud.tencent.com/document/product/876/41728
*/

// 1. 获取数据库引用
var db = app.database();

// 2. 构造查询语句
db
  // collection() 方法获取一个集合的引用
  .collection("books")
  // where() 方法传入一个 query 对象,数据库返回集合中字段等于指定值的 JSON 文档。
  .where({
    name: "The Catcher in the Rye"
  })
  // get() 方法会触发网络请求,往数据库取数据
  .get()
  .then(function (res) {
    console.log(res);
    // 输出 [{ "name": "The Catcher in the Rye", ... }]
  });

小程序

// 1. 获取数据库引用
const db = wx.cloud.database();

// 2. 构造查询语句
db
  // collection() 方法获取一个集合的引用
  .collection("books")
  // where() 方法传入一个 query 对象,数据库返回集合中字段等于指定值的 JSON 文档。
  .where({
    name: "The Catcher in the Rye"
  })
  // get() 方法会触发网络请求,往数据库取数据
  .get()
  .then(function (res) {
    console.log(res);
    // 输出 [{ "name": "The Catcher in the Rye", ... }]
  });

服务端调用

通过服务端调用时,需要在 SDK 初始化参数中,填入腾讯云密钥(SecretID 和 SecretKey),然后以管理员身份进行数据库的读写操作。

说明:

在 CloudBase 云函数内使用服务端 SDK 时,开发者不需要填入腾讯云密钥即可使用。

Node.js

const cloudbase = require('@cloudbase/node-sdk')

const app = cloudbase.init({})

// 1. 获取数据库引用
var db = app.database();

exports.main = async (event, context) => {
  // 2. 构造查询语句
  const res = await db
    // collection() 方法获取一个集合的引用
    .collection("books")
    // where() 方法传入一个 query 对象,数据库返回集合中字段等于指定值的 JSON 文档。
    .where({
      name: "The Catcher in the Rye"
    })
    // get() 方法会触发网络请求,往数据库取数据
    .get()

  return {
    res
  }
}

权限控制

上文中提到,用户端与服务端是以不同的身份和权限调用云数据库的。

服务端调用

服务端上,是以管理员身份调用云数据库的,拥有读取、写入、修改、删除任意数据的权限

所以服务端又称管理端

用户端调用

用户端上,需要进行登录鉴权之后,以当前用户的身份调用云数据库,受到数据库权限的控制。

云数据库支持四种基础的数据库权限,如下:

权限 说明 使用场景
仅创建者可写,所有人可读 数据只有创建者可写、所有人可读 文章、公开评论
仅创建者可读写 数据只有创建者可读写,其他用户不可读写 私密相册、用户私密数据
仅管理端可写,所有人可读 该数据只有管理端可写,所有人可读 商品信息、配置信息
仅管理端可读写 该数据只有管理端可读写 不对外暴露的数据

例如,当数据库权限设置为【仅创建者可写,所有人可读】时,来自用户端的调用只能修改、删除当前用户身份的数据,但可以读到其它用户创建的数据。

说明:

在某些复杂场景下,如果基础权限控制无法满足您的需求,您可以使用自定义安全规则,通过编写规则语句来完成权限的设置。

特殊字段

_id 字段

云数据库中,每条记录都有一个 _id 字段作为这条数据的唯一标识,在插入记录时会自动生成。

您也可以使用自定义的 _id,但需要保证全局唯一性

_openid 字段

每条记录中可能存在 _openid 字段,用于标识记录的创建者,它会在插入记录时,根据用户身份自动生成。

调用来源 _openid 含义
微信小程序 用户的微信 OpenID
Web SDK 用户的云开发 Uid
说明:

在服务端(例如云函数)或者管理端(例如控制台)中创建的记录,不会自动生成 _openid 字段,因为这是属于管理员创建的记录,并不属于某个用户。

目录