# 数据表

数据存储是知晓云提供的核心功能之一，借助它，你可以省去自己搭建数据库，维护数据库及优化数据库查询等麻烦操作。通过以下操作，便可以向在控制台创建的数据表添加一条记录：

```javascript
let tableName = 'product'
// 通过 `tableName` 实例化一个 `TableObject` 对象，操作该对象即相当于操作对应的数据表
let Product = new BaaS.TableObject(tableName)
// 本地创建一条空记录
let product = Product.create()

let apple = {
  name: 'apple',
  price: 1,
  desc: ['good'],
  amount: 0,
  created_by: 36395395,
}

// 为上面创建的空记录赋值，并保存到服务器
product.set(apple).save().then(res=>{
  console.log(res)
})
```

**返回示例**

res 结构如下：

```javascript
{
  "status": 201,
  "data": {
      "_id": "59a3c2b5afb7766a5ec6e84e",
      "amount": 0,
      "created_at": 1503904437,
      "created_by": 36395395,
      "desc": ["good"],
      "id": "59a3c2b5afb7766a5ec6e84e",
      "name": "apple",
      "price": 1.0,
      "read_perm": ["user:*"],
      "updated_at": 1503904437,
      "write_perm": ["user:*"]
  }
}
```

数据表支持多种类型的数据，包括数组类型，时间日期类型，geojson 类型和文件类型，并且支持原子操作等高级功能，如下，既是对产品数量的进行原子性减 1 操作：

```javascript
let product = Product.getWithoutData(recordID)
// 执行原子性减 1
product.incrementBy('amount', -1)
product.update().then(res => {
  console.log(res)
})
```

**返回示例**

res 结构如下：

```javascript
{
  "status": 200,
  "data": {
      "_id": "59a3c2b5afb7766a5ec6e84e",
      "amount": -1,
      "created_at": 1503904437,
      "created_by": 36395395,
      "desc": ["good"],
      "id": "59a3c2b5afb7766a5ec6e84e",
      "name": "apple",
      "price": 1.0,
      "read_perm": ["user:*"],
      "updated_at": 1503904437,
      "write_perm": ["user:*"]
  }
}
```

同时，SDK 提供了多种复杂查询操作，包括正则匹配查询，数组查询，甚至是与或的组合查询，如下是正则匹配查询的使用：

使用高级查询我们需要创建一个 `BaaS.Query` 对象实例，通过在 `Query` 实例上调用 `matches`、`compare` 等方法来设置查询条件，

然后调用 `TableObject` 实例的 `setQuery` 方法，来设置查询条件。

最后调用 `TableObject` 实例的 `find` 方法，来发起查询。find 方法返回值为一个 Promise。

```javascript
// 假设 product 表有一个字段为 product_id ，其中数据的格式形如 '112233'
let Product = new BaaS.TableObject('product')
var query = new BaaS.Query()

// 查找产品 ID 以 11 开头，以 33 结尾的产品
regx = /^11\d+33$/

query.matches('product_id', regx)
Product.setQuery(query).find().then(res => {
  console.log(res)
})
```

**返回示例**

res 结构如下

```javascript
{
  "status": 200,
  "data": {
    "meta": {
      "limit": 20,
      "next": null,
      "offset": 0,
      "previous": null,
      "total_count": 2
    },
    "objects": [
      {
        "created_at": 1487053098,
        "id": "59a3c2b5afb7766a5ec6e84f",
        "product_id": "112233"
      },
      {
        "created_at": 1487053095,
        "id": "59a3c2b5afb7766a5ec6e84e",
        "product_id": "112333"
      }
    ]
  }
}
```

## 关于 `created_by` 字段

如果在云函数中创建数据记录时没有指定 `created_by` 字段，则创建的记录的 `created_by` 将是应用所属于企业的超级管理员的用户 ID。 此 ID 在控制台 - 用户中将无法被查到（因为并不是小程序 / Web 应用用户）

如果云函数是由小程序所调用，而云函数中需要以小程序用户身份创建记录，可以从 [event](https://github.com/ifanrx/hydrogen-js-sdk-doc/tree/8b89025fd59969fb49bfd90c0d414caab8e16521/cloud-function/node-sdk/usage-notice.html#%E4%BA%91%E5%87%BD%E6%95%B0%E4%B8%AD-event-%E7%BB%93%E6%9E%84%E8%AF%B4%E6%98%8E) 中获取到请求云函数用户的信息，从而指定创建记录的 `created_by`：

```javascript
exports.main = function functionName(event, callback) {
  let tableName = 'product'
  let Product = new BaaS.TableObject(tableName)
  let product = Product.create()
  let apple = {
    name: 'apple',
    created_by: event.request.user.id
  }
  product.set(apple).save().then(res=>{
    callback(null, res.data)
  })
}
```

阅读以下章节，了解更多数据表操作接口：

* [数据类型](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/data-type)
* [新增数据项](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/create-record)
* [更新数据项](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/update-record)
* [删除数据项](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/delete-record)
* [获取数据项](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/get-record-detail)
* [查询数据项](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/query)
* [分页和排序](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/limit-and-order)
* [地理位置操作](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/geo)
* [字段过滤与扩展](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/select-and-expand)
* [数据导入导出操作](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/operation)
* [API 参考](https://ifanr.gitbook.io/baas-js-sdk/node-sdk/schema/api-reference)
