关于云开发 数据库HTTP API不支持Aggregate的解决方案
发布于 4 年前 作者 xiulan89 2562 次浏览 来自 分享

今天调试云开发HTTP API时,发现数据库调用不支持Aggregate(已得到官方确认),这可以怎么办,稍微复杂点的业务数据,可能就需要Aggregate的加持,对于Document数据库来讲,没有Aggregate,就像男人练了僻邪剑谱一样,武功再高,也时娘炮。
既然不想变娘炮,得想办法解决啊,经过一番思考,顿时有了主意,既然HTTP API是支持触发云函数的,而云函数可是全BUFF加持,绝不是HTTP API那阉割版的半吊子,我们是不是可以通过HTTP API触发云函数的方式来间接实现数据库的聚合功能呢?
说干就干,首先实现云函数,思路是,请求端组织数据库执行语句,通过HTTP API参数传入,云函数端得到这个参数,将其实例化为一个function,然后调用这个function来实现数据库查询,代码如下:

const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
});

const db = cloud.database();

exports.main = async (event, context) => {
let param = event.POSTBODY;
let func = new Function("db", "return " + param);
let result = await func(db);
return result;
}

好了,代码很简短,下面我们在服务器来测试一下,服务端代码如下:

 public void test(){
        Database db = Database.getInstance();
        String queryStr = db.collection("commodity").aggregate().match(new JSONObject().fluentPut("key", 22))
                .group(new JSONObject()
                        .fluentPut("_id", "$key2")
                        .fluentPut("avgOrder", avg("order"))
                )
                .sort("avgOrder", Database.ASC)
                .end();

        JSONObject params = new JSONObject()
                .fluentPut("POSTBODY", queryStr);

        JSONObject result = JSONObject.parseObject(HttpRequest
                .post(this.tokenService.getCloudFunctionUrl("fun1"))
                .send(params.toJSONString())
                .body()
        );
        System.out.println(result);
    }

数据库中有如下数据:

  {"key": 22, "key2": "aaa", "order": 11}
  {"key": 22, "key2": "aaa", "order": 33}
  {"key": 22, "key2": "bbb", "order": 44}

后台断点,查看生成的数据库查询语句如下

继续执行,得到的结果如下:

至此,一个云函数彻底解决,云开发HTTP API数据库不支持Aggregate的问题,撒花!

1 回复

回到顶部