关于云开发数据库的使用经验和建议

本文分享了在小程序·云开发中使用数据库的经验,包括直接使用API、数据聚合、Promise与async配合、整合框架以及高级用法。提出了结合云函数、HTTPS和封装API来实现统一接口的建议,同时强调了数据库的权限、索引优化和业务逻辑封装的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

小程序·云开发是微信团队联合腾讯云推出的专业的小程序开发服务。

开发者可以使用云开发快速开发小程序、小游戏、公众号网页等,并且原生打通微信开放能力。

开发者无需搭建服务器,可免鉴权直接使用平台提供的 API 进行业务开发。

数据库的上手、初始化等可参看官方链接:小程序·云开发

二、使用经验

直接使用云开发API

场景:页面或方法的逻辑简单,关联一个数据库,无联表查询

例子:

db.collection('todos').doc('todo-identifiant-aleatoire').get({
  success: function(res) {
    // res.data 包含该记录的数据
    console.log(res.data)
  }
})

使用数据聚合能力

场景:页面或方法的逻辑中等,关联多个数据库,可能存在联表查询或数据处理

例子:

const db = wx.cloud.database()
const $ = db.command.aggregate
db.collection('books').aggregate()
  .group({
    // 按 category 字段分组
    _id: '$category',
    // 让输出的每组记录有一个 avgSales 字段,其值是组内所有记录的 sales 字段的平均值
    avgSales: $.avg('$sales')
  })
  .end()

借助promise,async等

场景:页面或方法的逻辑较为复杂,关联多个数据库,可能存在多次查询以及云函数或https请求

以下是对云开发CMS导出数据的扩展案例

其中整合了上述的几种方式

例子:

const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
var xlsx = require('node-xlsx');
​
const db = cloud.database();
const MAX_LIMIT = 100;
const _ = db.command;
exports.main = async (event, context) => {
  console.log(event)
  event.queryStringParameters = event.queryStringParameters||{};
  const collection = event.collection || event.queryStringParameters.collection;
​
  const params = event.params || event.queryStringParameters.params || {};
  // const acceptType = ["String", "Tel", "Array", "Number", "Connect", "Boolean", "Enum", "Date", "DateTime"]; //"File","Image"
  const unacceptType = ["File", "Image"];
  const schemasRes = await db.collection("tcb-ext-cms-schemas").where({
    collectionName: collection
  }).get();
  const schemas = schemasRes.data[0];
​
  let connectList = [];
​
  const title = event.title || event.queryStringParameters.title || schemas.displayName || "数据";
​
  // 先取出集合记录总数
​
  const countRes = await db.collection(collection).where(params).count();
  const fields = schemas.fields.filter(function (schemas) {
    return unacceptType.indexOf(schemas.type) == -1 && (!schemas.isHidden);
  });
  const connectResourcenList = [];
  fields.forEach(field => {
    if (field.type == "Connect") {
      connectList.push(field);
      connectResourcenList.push(field.connectResource)
    }
  });
​
  const schemasListRes = await db.collection("tcb-ext-cms-schemas").where({
    _id: _.in(connectResourcenList)
  }).limit(MAX_LIMIT).get();
  const schemasList = schemasListRes.data || [];
​
  // console.log("fields==============================")
  console.log(schemasList)
  const total = countRes.total
  // 计算需分几次取
  const batchTimes = Math.ceil(total / MAX_LIMIT)
  // 承载所有读操作的 promise 的数组
  const tasks = []
  for (let i = 0; i < batchTimes; i++) {
    //console.log(connectList.length)
    if (connectList.length > 0) {
      let lookupList = [];
      connectList.forEach(connect => {
        const connectschemas = schemasList.filter(function (schemas) {
          return schemas._id == connect.connectResource;
        })[0];
        lookupList.push({
          from: connectschemas.collectionName,
          localField: connect.name,
          foreignField: '_id',
          as: "connect" + connect.name
        })
​
      });
​
      let aggregate = db.collection(collection).aggregate().match(params).skip(i * MAX_LIMIT).limit(MAX_LIMIT);
​
      for (let index = 0; index < connectList.length; index++) {
        aggregate = aggregate.lookup(lookupList[index]);
​
      }
​
      aggregate = aggregate.end();
​
      tasks.push(aggregate)
    } else {
​
      const promise = db.collection(collection).where(params).skip(i * MAX_LIMIT).limit(MAX_LIMIT).get();
      tasks.push(promise)
    }
​
  }
  console.log(tasks)
  // 等待所有
  let recordRes = (await Promise.all(tasks)).reduce((acc, cur) => {
​
    return {
      list: (acc.list || []).concat(cur.list || []),
      data: (acc.data || []).concat(cur.data || []),
    }
  })
​
  let records = (recordRes.list || []).concat(recordRes.data || []) || [];
  //1.定义表格名
  let dataCVS = title + '.xlsx';
  let excelData = [];
  let row = [];
  fields.forEach(field => {
    row.push(field.displayName)
  });
​
  excelData.push(row);
​
  records.forEach(record => {
    let arr = [];
    fields.forEach(field => {
      if (!record.hasOwnProperty(field.name)) {
        arr.push("")
      } else {
        switch (field.type) {
     
<think>好的,我需要回答用户关于如何直接从客户端查询微信云开发数据库而不使用云函数的问题。首先,用户希望不使用云函数,所以我要确定微信小程序的前端是否支持直接调用数据库API。根据引用[1],微信小程序的云开发SDK允许在客户端直接读写数据,不需要云函数。 接下来,我需要整理具体的步骤方法。用户提到了数据库查询API,所以应该详细说明如何在小程序前端使用wx.cloud.database()来获取数据库引用,然后选择集合,使用get()方法查询数据。同时,用户可能需要了解如何添加查询条件,比如where、orderBy等,这些在MongoDB风格的API中都是支持的。 然后,用户可能需要示例代码来具体展示这个过程。我需要确保代码正确,使用JavaScript,并且符合云开发的最佳实践,比如处理异步操作错误。同时,提醒用户注意权限问题,因为在客户端直接操作数据库需要正确配置安全规则,避免未授权访问,这可以参考引用[2]中的错误信息,说明权限配置的重要性。 还需要指出客户端查询的限制,比如只能查询权限允许的数据,不能进行敏感操作,而复杂查询可能需要云函数。最后,生成相关问题,帮助用户进一步了解云数据库使用、安全规则配置性能优化。 检查是否有遗漏点,比如是否需要初始化云开发环境,或者是否需要处理Promise回调。确保回答结构清晰,步骤明确,并引用提供的参考资料来支持回答的正确性。</think>### 如何直接从客户端查询微信云开发数据库而不使用云函数? 在微信小程序云开发中,**客户端可以直接调用数据库API进行查询操作**,无需通过云函数。以下是具体实现方法: --- #### 1. **初始化数据库环境** 在小程序前端代码中,首先需要初始化云开发环境: ```javascript wx.cloud.init({ env: "你的云环境ID" // 需在云开发控制台获取 }); const db = wx.cloud.database(); // 获取数据库引用 ``` --- #### 2. **查询数据库集合** 通过`db.collection`选择目标集合,使用`get()`方法获取数据: ```javascript // 示例:查询名为"users"的集合中所有文档 db.collection("users").get().then(res => { console.log("查询结果:", res.data); // 数据存储在res.data中 }).catch(err => { console.error("查询失败:", err); }); ``` --- #### 3. **添加查询条件** 支持链式调用`where`、`orderBy`、`limit`等方法筛选数据: ```javascript // 示例:查询age大于18且按name字段升序排列的前10条数据 db.collection("users") .where({ age: _.gt(18) // 使用数据库操作符(需引入const _ = db.command) }) .orderBy("name", "asc") .limit(10) .get() .then(res => { console.log("筛选结果:", res.data); }); ``` --- #### 4. **注意事项** - **权限控制**:客户端查询需配置集合的权限规则(控制台 → 数据库 → 权限设置),默认仅允许用户读写自己的数据[^1]。 - **操作符限制**:客户端不支持部分敏感操作(如聚合查询),需改用云函数实现[^2]。 - **性能优化**:避免一次性查询过多数据,建议分页(`skip` + `limit`)或使用索引。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值