# 数据库脚本

数据库脚本是用来执行数据库 CRUD & 聚合 操作的脚本，语法同云开发 SDK 数据库语法，目前可应用数据库脚本在以下场景：

1. 控制台中可以使用数据库脚本进行高级数据库 CRUD & 聚合 管理操作 [文档](console-dbscript)
1. HTTP API 中的数据库接口 [文档](/minigame/dev/wxcloud/reference-http-api/database/)

### 数据库脚本语法

数据库脚本语法同 SDK 数据库语法，是 JavaScript 的真子集，出于安全考虑在语法上带有一定的限制性，以下是一个查询的脚本示例：

```js
db.collection('test')
  .where({
    price: _.gt(10)
  })
  .field({
    name: true,
    price: true,
  })
  .orderBy('price', 'desc')
  .skip(1)
  .limit(100)
  .get()
```

#### 全局变量

在脚本中提供以下全局变量：

| 变量名 | 说明 |
| -- | -- |
| `db` | 等于 `wx.cloud.database()` 的结果 (不区分环境) |
| `_` | 等于 `db.command` |

#### 语法规则

以下列举以 JavaScript 语法表达式出发解释主要的语法异同点（规则和限制）：

| 表达式 | 支持性 | 示例 |
| -- | -- | -- |
| 获取属性 | 支持获取对象的合法属性，对象如 `db`、`_`，合法属性如 `db` 的 `collection` 属性 | `db.collection` |
| 函数调用 | 支持 | `db.collection()` |
| new | 支持 | `new db.Geo.Point(113, 23)` |
| 变量声明 | 支持变量声明，同时支持对象解构器的声明方式 | `const Geo = db.Geo` 
 `const { Point } = db.Geo` |
| 对象声明 | 支持 | `const obj = { age: _.gt(10) }` |
| 常量声明 | 支持 | `const max = 10` |
| 负数 | 支持 | `const min = -5` |
| 注释 | 支持 | `// comment` 
 `/* comment */` |
| 其他 | 不支持 | |

不支持表达式简要一览：

- 函数声明
- 类声明
- 变量赋值（不能声明后重新赋值）
- 算术运算（`+`, `-`...）
- 三值表达式（`a ? b : c`）
- 条件表达式（`if`, `else`）
- switch 表达式
- 遍历表达式（`for...in`, `for...of`, ...）
- 数组解构器
- try catch

#### 报错提示

如果语法不正确，在错误信息中会给出**错误原因**及**出错的行列号**，示例：

![syntax errro](https://res8.wxqcloud.qq.com.cn/wxdoc/552d41c2-8d13-43a5-877c-3d2e3871d5b7.png)
