查询与管理数据

后端云服务(Basement)的数据存储服务提供了大量接口。通过这些接口,您可以对集合进行数据读取、写入、更新、删除。

关于此任务

以下步骤介绍如何将数据插入到集合中。所有数据的组织结构跟 JSON 一致。基于 管理集合 的示例,对文档数据进行相关操作。

要了解 Basement 支持的数据存储 API, 查看 数据存储 API

读取数据

读取数据包含以下不同场景:

  • 从集合中读取所有数据。例如,查询所有的图片:
  1. basement.db.collection('images').find();
  • 从集合中读取数据,并附带查询条件。例如,查询特定用户添加的图片:
  1. basement.db.collection('images').find({ 'userId': userId });
  • 对数据进行排序。例如,将最新添加的图片排在后面。
  1. basement.db.collection('images').find({ 'userId': userId }, { 'uploadTime': -1 });
  • 回到图片画廊小程序的示例,从 Basement 的数据存储中读取用户的图片列表,并显示出来。
  1. // client/index/index.js
  2. // 显示指定当前用户的图片列表
  3. onShow() {
  4. basement.user.getInfo().then((user) => {
  5. this._getImages(user);
  6. }).catch(console.log);
  7. },
  8. // 获取特定用户的图片列表
  9. _getImages(user) {
  10. basement.db.collection('images')
  11. .find({ userId: user.userId }, { uploadTime: -1 })
  12. .then(({ result: images }) => {
  13. images.map((item) => {
  14. item.uploadTime = new Date(item.uploadTime).toDateString();
  15. return item;
  16. });
  17. this.setData({ images });
  18. })
  19. .catch(console.log);
  20. },

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

写入数据

写入数据有以下处理方式:

  • 通过 insertOne() 方法逐条向集合写入数据。
  • 通过 insertMany() 方法批量写入数据。
    例如,使用 insertOne() 方法为用户添加一个文档:
  1. basement.db.collection('images').insertOne({
  2. text: inputText,
  3. url: imageUrl,
  4. });

在图片画廊小程序的示例中,当您添加图片的时候,需要往集合写入一个文档:

  1. // client/add-image/add-image.js
  2. // 将新的任务添加到当前用户的图片列表中
  3. add() {
  4. basement.user.getInfo().then((user) => {
  5. basement.db.collection('images').insertOne({
  6. text: this.data.inputValue,
  7. url: this.data.imageUrl ? this.data.imageUrl : false,
  8. userId: user.userId,
  9. uploadTime: new Date(),
  10. }).then(() => {
  11. my.navigateBack();
  12. }).catch(console.log);
  13. }).catch(console.log);
  14. },

更新数据

更新数据有以下处理方式:

  • 通过 updateOne() 方法更新符合条件的第一条数据。
  • 通过 updateMany() 方法更新符合条件的所有数据。
    例如,更新一个文档的内容,用 updateOne() 来更新这条数据:
  1. basement.db.collection('images').updateOne(
  2. { _id: imageId },
  3. {
  4. $set: {
  5. text: result.inputValue,
  6. }
  7. }
  8. );

其中, $set 是更新记录的处理方式。要了解更多更新方式,查看 数据存储 API

在图片画廊的小程序例子中,用户触发重命名图片名称操作时,显示对话框让用户输入新的图片名称,执行更新文档中的名称字段:

  1. // client/index/index.js
  2. // 变更图片名称的事件处理
  3. rename(e) {
  4. const dataset = e.target.dataset;
  5. my.prompt({
  6. title: '修改名称',
  7. message: '请输入新的图片名称:',
  8. placeholder: '',
  9. okButtonText: '确定',
  10. cancelButtonText: '取消',
  11. success: (result) => {
  12. if (result.ok) {
  13. basement.db.collection('images').updateOne(
  14. { _id: dataset.itemId },
  15. {
  16. $set: {
  17. text: result.inputValue,
  18. }
  19. }
  20. ).then(() => {
  21. this._getImages(this.data.user);
  22. }).catch(console.log);
  23. }
  24. },
  25. });
  26. },

删除数据

找到对应的数据条目进行删除。删除数据有以下处理方式:

  • 通过 deleteOne() 方法删除第一个符合条件的数据。
  • 通过 deleteMany() 方法删除所有符合条件的数据。
    例如,删除掉其中一个文档,使用 deleteOne() 操作:
  1. basement.db.collection('image').deleteOne({ _id: imageId });

当点击示例小程序图片删除按钮时,唤起删除对话框,确认后执行删除和刷新图片列表:

  1. // client/index/index.js
  2. // 删除图片的事件处理
  3. delete(e) {
  4. const dataset = e.target.dataset;
  5. // 确认和删除图片
  6. my.confirm({
  7. title: '删除图片',
  8. content: '是否确认删除该图片?',
  9. confirmButtonText: '删除',
  10. cancelButtonText: '取消',
  11. success: (result) => {
  12. if (result.confirm) {
  13. basement.db.collection('images').deleteOne({
  14. '_id': dataset.itemId,
  15. 'userId': this.data.user.userId,
  16. }).then(() => {
  17. // 刷新任务列表
  18. this._getImages(this.data.user);
  19. }).catch(console.log);
  20. }
  21. },
  22. });
  23. },

原文: https://docs.alipay.com/mini/cloud-service/dqtnht