您可以通过EMAS Serverless提供的数据存储服务API对集合(相当于MySQL中的表)进行数据读取、写入、更新、删除等操作。

读取数据

以下代码示例展示了适用于不同场景的数据读取方法:
  • 从集合中读取所有数据。

    例如,查询所有图片:

    mpserverless.db.collection('images').find();
  • 根据查询条件从集合中读取指定数据。

    例如,查询特定用户添加的图片:

    mpserverless.db.collection('images').find({ 'userId': userId });
  • 读取数据并对获取的数据进行排序。

    例如,将获取的图片按照添加时间进行排序:

    mpserverless.db.collection('images').find({ 'userId': userId }, {sort: {'uploadTime': -1 }});
  • 读取数据并对获取的数据进行操作。

    例如,读取用户的图片列表,并显示出来。其中,_getImages(user) 是封装好的方法,用来获取用户对应的图片列表,并更新小程序中的数据,此时页面内容也会刷新。在onShow()方法中,当用户信息获取成功,便去获取用户的图片列表并显示到页面上。

    // client/index/index.js
    
    // 显示指定当前用户的图片列表
    onShow() {
      mpserverless.user.getInfo().then((user) => {
        this._getImages(user);
      }).catch(console.log);
    },
    
    // 获取特定用户的图片列表
    _getImages(user) {
      mpserverless.db.collection('images')
      .find({ userId: user.userId }, {sort: {uploadTime: -1 }})
      .then(({ result: images }) => {
        images.map((item) => {
          item.uploadTime = new Date(item.uploadTime).toDateString();
          return item;
        });
        this.setData({ images });
      })
      .catch(console.log);
    },

写入数据

您可以通过以下两种方式写入数据:

  • 通过insertOne()方法逐条向集合写入数据。

    例如,使用insertOne()方法为用户添加一个文档:

    mpserverless.db.collection('images').insertOne({
      text: inputText,
      url: imageUrl,
    });
  • 通过insertMany()方法批量写入数据。

    例如,使用insertMany()方法为用户添加一个文档:

    // client/add-image/add-image.js
    
    // 将新的任务添加到当前用户的图片列表中
    add() {
      mpserverless.user.getInfo().then((user) => {
        mpserverless.db.collection('images').insertOne({
          text: this.data.inputValue,
          url: this.data.imageUrl ? this.data.imageUrl : false,
          userId: user.userId,
          uploadTime: new Date(),
        }).then(() => {
          my.navigateBack();
        }).catch(console.log);
      }).catch(console.log);
    },

更新数据

您可以通过以下两种方式更新数据:

  • 通过updateOne()方法更新符合条件的第一条数据。

    例如,使用updateOne()方法更新一个文档:

    mpserverless.db.collection('images').updateOne(
      { _id: imageId },
      {
        $set: {
          text: result.inputValue,
        }
      }
    );

    其中, $set是更新记录的处理方式。

  • 通过updateMany()方法更新符合条件的所有数据。

    以一个图片管理的小程序为例,用户触发重命名图片名称操作时,显示对话框让用户输入新的图片名称,执行更新文档中的名称字段:

    // client/index/index.js
    
    // 变更图片名称的事件处理
    rename(e) {
      const dataset = e.target.dataset;
    
      my.prompt({
        title: '修改名称',
        message: '请输入新的图片名称:',
        placeholder: '',
        okButtonText: '确定',
        cancelButtonText: '取消',
        success: (result) => {
          if (result.ok) {
            mpserverless.db.collection('images').updateOne(
              { _id: dataset.itemId },
              {
                $set: {
                  text: result.inputValue,
                }
              }
            ).then(() => {
              this._getImages(this.data.user);
            }).catch(console.log);
          }
        },
      });
    },

删除数据

您可以通过以下两种方式删除数据:

  • 通过deleteOne()方法删除第一个符合条件的数据。

    例如,使用deleteOne()方法删除一个文档:

    mpserverless.db.collection('image').deleteOne({ _id: imageId });
  • 通过deleteMany()方法删除所有符合条件的数据。

    以一个图片管理的小程序为例,当用户单击示例小程序图片删除按钮时,唤起删除对话框,确认后执行删除和刷新图片列表:

    // client/index/index.js
    
    // 删除图片的事件处理
    delete(e) {
      const dataset = e.target.dataset;
    
      // 确认和删除图片
      my.confirm({
        title: '删除图片',
        content: '是否确认删除该图片?',
        confirmButtonText: '删除',
        cancelButtonText: '取消',
        success: (result) => {
          if (result.confirm) {
            mpserverless.db.collection('images').deleteOne({
              '_id': dataset.itemId,
              'userId': this.data.user.userId,
            }).then(() => {
              // 刷新任务列表
              this._getImages(this.data.user);
            }).catch(console.log);
          }
        },
      });
    },