云开发提供了一个 NoSQL 数据库,数据库中的每条记录都是一个 JSON 格式的对象。一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录(或称为文档),记录的格式是 JSON 对象。

关系型数据库和 JSON 数据库的概念对应关系如下表:

关系型 文档型
数据库 database 数据库 database
表 table 集合 collection
行 row 记录 record / doc
列 column 字段 field

?每条记录都有一个 _id 字段用以唯一标志一条记录、一个 _openid 字段用以标志记录的创建者。需要特别注意的是,在管理端(云控制台和云函数)中创建的不会有 _openid 字段,因为这是属于管理员创建的记录。开发者可以自定义 _id,但不可自定义和修改 _openid_openid 是在文档创建时由系统根据登录您的应用的用户默认创建的,开发者可使用其来标识和定位文档。

数据库 SDK 分为客户端(小程序端、网页端)和服务端,客户端 SDK 拥有严格的调用权限控制,开发者可在小程序或者网页内直接使用云开发的 SDK 操作数据库。而当开发者设计的应用中有不可从客户端直接调用的更高安全要求的数据时,也可在云函数内通过服务端 SDK(admin-sdk)进行操作,云函数的环境是与客户端完全隔离的,在云函数内可以以管理员权限安全的操作数据库。

数据库 API 包含增删改查的能力,使用 API 操作数据库只需三步:获取数据库引用、构造查询/更新条件、发出请求。 我们以在客户端查询数据为例,示例代码如下:

# 小程序端

// 1. 获取数据库引用
const db = wx.cloud.database();
// 2. 构造查询语句
// collection 方法获取一个集合的引用
// where 方法传入一个对象,数据库返回集合中字段等于指定值的 JSON 文档。API 也支持高级的查询条件(比如大于、小于、in 等),具体见文档查看支持列表
// get 方法会触发网络请求,往数据库取数据
db.collection("books")
  .where({
    publishInfo: {
      country: "United States"
    }
  })
  .get({
    success: function(res) {
      // 输出 [{ "title": "The Catcher in the Rye", ... }]
      console.log(res);
    }
  });

# 网页端(Web 端)

tcb.init({
  env: "xxxx"
});
// 1. 获取数据库引用
var db = tcb.database();
// 2. 构造查询语句
// collection 方法获取一个集合的引用
// where 方法传入一个对象,数据库返回集合中字段等于指定值的 JSON 文档。API 也支持高级的查询条件(比如大于、小于、in 等),具体见文档查看支持列表
// get 方法会触发网络请求,往数据库取数据
db.collection("books")
  .where({
    publishInfo: {
      country: "United States"
    }
  })
  .get(function(err, res) {
    // 输出 [{ "title": "The Catcher in the Rye", ... }]
    if (!err) {
      console.log(res);
    }
  });