关于云开发 数据库HTTP API不支持Aggregate的解决方案
今天调试云开发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的问题,撒花!