diff --git a/docs/uniCloud/clientdb.md b/docs/uniCloud/clientdb.md index 3a391f1ff7ad2d382fa637fc2a77bed2a8397e28..1bf4f67b146344492c1e050c3647c31284d61ade 100644 --- a/docs/uniCloud/clientdb.md +++ b/docs/uniCloud/clientdb.md @@ -583,9 +583,9 @@ db.collection('order,book') - 上面的查询指令中,上一阶段处理结果输出到下一阶段,上面的例子中表现为where中使用的是原名,orderBy中使用的是别名 - 目前不支持对联表查询的关联字段使用别名,即上述示例中的book_id不可设置别名 -#### 对字段操作后返回@operator +### 对字段操作后返回@operator -自`HBuilderX 3.0.8`起,clientDB支持对字段进行一定的操作之后再返回,详细可用的方法列表请参考:[聚合操作符](uniCloud/cf-database.md?id=aggregate-operator) +自`HBuilderX 3.0.8`起,clientDB支持对字段进行一定的操作之后再返回,详细可用的方法列表请参考:[聚合操作符](uniCloud/clientdb.md?id=aggregate-operator) 例:数据表class内有以下数据 @@ -606,7 +606,7 @@ db.collection('order,book') ```js const res = await db.collection('class') -.field('class,eq(["$grade",6]) as isTopGrade') +.field('class,eq(grade,6) as isTopGrade') .get() ``` @@ -627,7 +627,7 @@ const res = await db.collection('class') **注意** -- 方法内的字段名应使用$前缀 +- 如果要访问数组的某一项请使用arrayElemAt操作符,形如:`arrayElemAt(arr,1)` - 在进行权限校验时,会计算field内访问的所有字段计算权限。上面的例子中会使用表的read权限和grade、class字段的权限,来进行权限校验。 ### 排序orderBy@orderby @@ -1194,14 +1194,14 @@ db.collection("department").get({ #### 求和、求均值等累计操作 -所有可用的累计方法请参考[累计器操作符](uniCloud/cf-database.md?id=accumulator),下面以sum(求和)和avg(求均值)为例介绍如何使用 +所有可用的累计方法请参考[累计器操作符](uniCloud/clientdb.md?id=accumulator),下面以sum(求和)和avg(求均值)为例介绍如何使用 使用sum方法可以对数据进行求和统计。以上述数据为例,如下写法对不同班级进行分数统计 ```js const res = await db.collection('score') .groupBy('grade,class') -.groupField('sum("$score") as totalScore') +.groupField('sum(score) as totalScore') .get() ``` @@ -1230,7 +1230,7 @@ const res = await db.collection('score') ```js const res = await db.collection('score') .groupBy('grade,class') -.groupField('avg("$score") as avgScore') +.groupField('avg(score) as avgScore') .get() ``` @@ -1254,13 +1254,8 @@ const res = await db.collection('score') } ``` -**注意** - -- 方法内使用数据库字段时,为避免歧义需要使用带上$的字符串 -- 在不使用field,仅使用group和groupBy的情况下,会以group和groupBy内访问的所有字段的权限来校验访问是否合法。上面的例子中会使用表的read权限和grade、class、score三个字段的权限,来进行权限校验。 -- 在groupBy之前使用了field的情况下会使用field方法内的所有的字段的权限校验访问是否合法 -如果额外还在groupBy之前使用了field方法,此field不是用于决定最终的返回值而是用于决定将哪些数据传给groupBy和groupField使用 +如果额外还在groupBy之前使用了preField方法,此preField用于决定将哪些数据传给groupBy和groupField使用 例:如果上述数据中score是一个数组 @@ -1309,13 +1304,13 @@ const res = await db.collection('score') } ``` -如下field写法将上面的score数组求和之后传递给groupBy和groupField使用。在field内没出现的字段(比如name),在后面的方法里面不能使用 +如下preField写法将上面的score数组求和之后传递给groupBy和groupField使用。在preField内没出现的字段(比如name),在后面的方法里面不能使用 ```js const res = await db.collection('score') -.field('grade,class,sum("$score") as userTotalScore') +.preField('grade,class,sum(score) as userTotalScore') .groupBy('grade,class') -.groupField('avg("$userTotalScore") as avgScore') +.groupField('avg(userTotalScore) as avgScore') .get() ``` @@ -1341,7 +1336,8 @@ const res = await db.collection('score') **注意** -- 在上面使用field方法的情况下,会计算field内访问的所有字段计算权限。上面的例子中会使用表的read权限和grade、class、score三个字段的权限,来进行权限校验。 +- 在上面使用preField方法的情况下,会计算preField内访问的所有字段计算权限。上面的例子中会使用表的read权限和grade、class、score三个字段的权限,来进行权限校验。 +- 在不使用preField,仅使用groupBy和groupField的情况下,会以groupBy和groupField内访问的所有字段的权限来校验访问是否合法。 #### 统计数量 @@ -2231,3 +2227,169 @@ module.exports = { type } ``` + +## 可用聚合操作符列表@aggregate-operator + +为方便书写,clientDB内将聚合操作符的用法进行了简化(相对于云函数内使用聚合操作符而言)。以下是可以在clientDB中使用的聚合操作符 + +|操作符 |详细文档 |用法 |说明 | +|--- |--- |--- |--- | +|abs |[abs](uniCloud/cf-database.md?id=abs) |abs(<表达式>) |- | +|add |[add](uniCloud/cf-database.md?id=add-1) |add(<表达式1>,<表达式2>) |- | +|ceil |[ceil](uniCloud/cf-database.md?id=ceil) |ceil(<表达式>) |- | +|divide |[divide](uniCloud/cf-database.md?id=divide) |divide(<表达式1>,<表达式2>) |- | +|exp |[exp](uniCloud/cf-database.md?id=exp) |exp(<表达式>) |- | +|floor |[floor](uniCloud/cf-database.md?id=floor) |floor(<表达式>) |- | +|ln |[ln](uniCloud/cf-database.md?id=ln) |ln(<表达式>) |- | +|log |[log](uniCloud/cf-database.md?id=log) |log(<表达式1>,<表达式2>) |- | +|log10 |[log10](uniCloud/cf-database.md?id=log10) |log10(<表达式>) |- | +|mod |[mod](uniCloud/cf-database.md?id=mod) |mod(<表达式1>,<表达式2>) |- | +|multiply |[multiply](uniCloud/cf-database.md?id=multiply) |multiply(<表达式1>,<表达式2>) |- | +|pow |[pow](uniCloud/cf-database.md?id=pow) |pow(<表达式1>,<表达式2>) |- | +|sqrt |[sqrt](uniCloud/cf-database.md?id=sqrt) |sqrt(<表达式1>,<表达式2>) |- | +|subtract |[subtract](uniCloud/cf-database.md?id=subtract) |subtract(<表达式1>,<表达式2>) |- | +|trunc |[trunc](uniCloud/cf-database.md?id=trunc) |trunc(<表达式>) |- | +|arrayElemAt |[arrayElemAt](uniCloud/cf-database.md?id=arrayelemat) |arrayElemAt(<表达式1>,<表达式2>) |- | +|arrayToObject |[arrayToObject](uniCloud/cf-database.md?id=arraytoobject) |arrayToObject(<表达式>) |- | +|concatArrays |[concatArrays](uniCloud/cf-database.md?id=concatarrays) |concatArrays(<表达式1>,<表达式2>) |- | +|filter |[filter](uniCloud/cf-database.md?id=filter) |filter(,,) |- | +|in |[in](uniCloud/cf-database.md?id=in) |in(<表达式1>,<表达式2>) |- | +|indexOfArray |[indexOfArray](uniCloud/cf-database.md?id=indexofarray) |indexOfArray(<表达式1>,<表达式2>) |- | +|isArray |[isArray](uniCloud/cf-database.md?id=isarray) |isArray(<表达式>) |- | +|map |[map](uniCloud/cf-database.md?id=map) |map(,,) |- | +|objectToArray |[objectToArray](uniCloud/cf-database.md?id=objecttoarray) |objectToArray(<表达式>) |- | +|range |[range](uniCloud/cf-database.md?id=range) |range(<表达式1>,<表达式2>) |- | +|reduce |[reduce](uniCloud/cf-database.md?id=reduce) |reduce(,,) |- | +|reverseArray |[reverseArray](uniCloud/cf-database.md?id=reversearray) |reverseArray(<表达式>) |- | +|size |[size](uniCloud/cf-database.md?id=size) |size(<表达式>) |- | +|slice |[slice](uniCloud/cf-database.md?id=slice) |slice(<表达式1>,<表达式2>) |- | +|zip |[zip](uniCloud/cf-database.md?id=zip) |zip(,,) |- | +|and |[and](uniCloud/cf-database.md?id=and) |and(<表达式1>,<表达式2>) |- | +|not |[not](uniCloud/cf-database.md?id=not) |not(<表达式>) |- | +|or |[or](uniCloud/cf-database.md?id=or) |or(<表达式1>,<表达式2>) |- | +|cmp |[cmp](uniCloud/cf-database.md?id=cmp) |cmp(<表达式1>,<表达式2>) |- | +|eq |[eq](uniCloud/cf-database.md?id=eq) |eq(<表达式1>,<表达式2>) |- | +|gt |[gt](uniCloud/cf-database.md?id=gt) |gt(<表达式1>,<表达式2>) |- | +|gte |[gte](uniCloud/cf-database.md?id=gte) |gte(<表达式1>,<表达式2>) |- | +|lt |[lt](uniCloud/cf-database.md?id=lt) |lt(<表达式1>,<表达式2>) |- | +|lte |[lte](uniCloud/cf-database.md?id=lte) |lte(<表达式1>,<表达式2>) |- | +|neq |[neq](uniCloud/cf-database.md?id=neq) |neq(<表达式1>,<表达式2>) |- | +|cond |[cond](uniCloud/cf-database.md?id=cond) |cond(<表达式1>,<表达式2>) |- | +|ifNull |[ifNull](uniCloud/cf-database.md?id=ifnull) |ifNull(<表达式1>,<表达式2>) |- | +|switch |[switch](uniCloud/cf-database.md?id=switch) |switch(,) |- | +|dateFromParts |[dateFromParts](uniCloud/cf-database.md?id=datefromparts) |dateFromParts(,,,,,,,) |- | +|isoDateFromParts |[isoDateFromParts](uniCloud/cf-database.md?id=isodatefromparts)|isoDateFromParts(,,,,,,,) |云函数内此操作符对应dateFromParts| +|dateFromString |[dateFromString](uniCloud/cf-database.md?id=datefromstring) |dateFromString(,,,,) |- | +|dateToString |[dateToString](uniCloud/cf-database.md?id=datetostring) |dateToString(,,,) |- | +|dayOfMonth |[dayOfMonth](uniCloud/cf-database.md?id=dayofmonth) |dayOfMonth(,) |- | +|dayOfWeek |[dayOfWeek](uniCloud/cf-database.md?id=dayofweek) |dayOfWeek(,) |- | +|dayOfYear |[dayOfYear](uniCloud/cf-database.md?id=dayofyear) |dayOfYear(,) |- | +|hour |[hour](uniCloud/cf-database.md?id=hour) |hour(,) |- | +|isoDayOfWeek |[isoDayOfWeek](uniCloud/cf-database.md?id=isodayofweek) |isoDayOfWeek(,) |- | +|isoWeek |[isoWeek](uniCloud/cf-database.md?id=isoweek) |isoWeek(,) |- | +|isoWeekYear |[isoWeekYear](uniCloud/cf-database.md?id=isoweekyear) |isoWeekYear(,) |- | +|millisecond |[millisecond](uniCloud/cf-database.md?id=millisecond) |millisecond(,) |- | +|minute |[minute](uniCloud/cf-database.md?id=minute) |minute(,) |- | +|month |[month](uniCloud/cf-database.md?id=month) |month(,) |- | +|second |[second](uniCloud/cf-database.md?id=second) |second(,) |- | +|week |[week](uniCloud/cf-database.md?id=week) |week(,) |- | +|year |[year](uniCloud/cf-database.md?id=year) |year(,) |- | +|literal |[literal](uniCloud/cf-database.md?id=literal) |literal(<表达式>) |- | +|mergeObjects |[mergeObjects](uniCloud/cf-database.md?id=mergeobjects) |mergeObjects(<表达式1>,<表达式2>) |- | +|allElementsTrue |[allElementsTrue](uniCloud/cf-database.md?id=allelementstrue) |allElementsTrue(<表达式1>,<表达式2>) |- | +|anyElementTrue |[anyElementTrue](uniCloud/cf-database.md?id=anyelementtrue) |anyElementTrue(<表达式1>,<表达式2>) |- | +|setDifference |[setDifference](uniCloud/cf-database.md?id=setdifference) |setDifference(<表达式1>,<表达式2>) |- | +|setEquals |[setEquals](uniCloud/cf-database.md?id=setequals) |setEquals(<表达式1>,<表达式2>) |- | +|setIntersection |[setIntersection](uniCloud/cf-database.md?id=setintersection) |setIntersection(<表达式1>,<表达式2>) |- | +|setIsSubset |[setIsSubset](uniCloud/cf-database.md?id=setissubset) |setIsSubset(<表达式1>,<表达式2>) |- | +|setUnion |[setUnion](uniCloud/cf-database.md?id=setunion) |setUnion(<表达式1>,<表达式2>) |- | +|concat |[concat](uniCloud/cf-database.md?id=concat) |concat(<表达式1>,<表达式2>) |- | +|indexOfBytes |[indexOfBytes](uniCloud/cf-database.md?id=indexofbytes) |indexOfBytes(<表达式1>,<表达式2>) |- | +|indexOfCP |[indexOfCP](uniCloud/cf-database.md?id=indexofcp) |indexOfCP(<表达式1>,<表达式2>) |- | +|split |[split](uniCloud/cf-database.md?id=split) |split(<表达式1>,<表达式2>) |- | +|strLenBytes |[strLenBytes](uniCloud/cf-database.md?id=strlenbytes) |strLenBytes(<表达式>) |- | +|strLenCP |[strLenCP](uniCloud/cf-database.md?id=strlencp) |strLenCP(<表达式>) |- | +|strcasecmp |[strcasecmp](uniCloud/cf-database.md?id=strcasecmp) |strcasecmp(<表达式1>,<表达式2>) |- | +|substr |[substr](uniCloud/cf-database.md?id=substr) |substr(<表达式1>,<表达式2>) |- | +|substrBytes |[substrBytes](uniCloud/cf-database.md?id=substrbytes) |substrBytes(<表达式1>,<表达式2>) |- | +|substrCP |[substrCP](uniCloud/cf-database.md?id=substrcp) |substrCP(<表达式1>,<表达式2>) |- | +|toLower |[toLower](uniCloud/cf-database.md?id=tolower) |toLower(<表达式>) |- | +|toUpper |[toUpper](uniCloud/cf-database.md?id=toupper) |toUpper(<表达式>) |- | +|addToSet |[addToSet](uniCloud/cf-database.md?id=addtoset) |addToSet(<表达式>) |- | +|avg |[avg](uniCloud/cf-database.md?id=avg) |avg(<表达式>) |- | +|first |[first](uniCloud/cf-database.md?id=first) |first(<表达式>) |- | +|last |[last](uniCloud/cf-database.md?id=last) |last(<表达式>) |- | +|max |[max](uniCloud/cf-database.md?id=max) |max(<表达式>) |- | +|min |[min](uniCloud/cf-database.md?id=min) |min(<表达式>) |- | +|push |[push](uniCloud/cf-database.md?id=push) |push(<表达式>) |- | +|stdDevPop |[stdDevPop](uniCloud/cf-database.md?id=stddevpop) |stdDevPop(<表达式>) |- | +|stdDevSamp |[stdDevSamp](uniCloud/cf-database.md?id=stddevsamp) |stdDevSamp(<表达式>) |- | +|sum |[sum](uniCloud/cf-database.md?id=sum) |sum(<表达式>) |- | +|let |[let](uniCloud/cf-database.md?id=let) |let(,) |- | + +以上操作符还可以组合使用 + +例:数据表article内有以下数据 + +```js +{ + "_id": "1", + "publish_date": 1611141512751, + "content": "hello uniCloud content 01", + "content": "hello uniCloud title 01", +} + +{ + "_id": "2", + "publish_date": 1611141512752, + "content": "hello uniCloud content 02", + "content": "hello uniCloud title 02", +} + +{ + "_id": "3", + "publish_date": 1611141512753, + "content": "hello uniCloud content 03", + "content": "hello uniCloud title 03", +} +``` + +可以通过以下查询将publish_date转为`2021-01-20`形式,然后进行分组统计 + +```js +const res = await db.collection('article') +.groupBy('dateToString(add(new Date(0),publish_date),"%Y-%m-%d","+0800") as publish_date_str') +.groupField('count(*) as total') +.get() +``` + +上述代码使用add将publish_date时间戳转为日期类型,再用dateToString将上一步的日期按照时区'+0800'(北京时间),格式化为`4位年-2位月-2位日`格式,完整格式化参数请参考[dateToString](uniCloud/cf-database.md?id=datetostring)。 + +上述代码执行结果为 + +```js +res = { + result: { + data: [{ + publish_date_str: '2021-01-20', + total: 3 + }] + } +} +``` + +### 累计器操作符@accumulator + +|操作符 |详细文档 |用法 |说明 | +|--- |--- |--- |--- | +|addToSet |[addToSet](uniCloud/cf-database.md?id=addtoset) |addToSet(<表达式>) |- | +|avg |[avg](uniCloud/cf-database.md?id=avg) |avg(<表达式>) |- | +|first |[first](uniCloud/cf-database.md?id=first) |first(<表达式>) |- | +|last |[last](uniCloud/cf-database.md?id=last) |last(<表达式>) |- | +|max |[max](uniCloud/cf-database.md?id=max) |max(<表达式>) |- | +|min |[min](uniCloud/cf-database.md?id=min) |min(<表达式>) |- | +|push |[push](uniCloud/cf-database.md?id=push) |push(<表达式>) |- | +|stdDevPop |[stdDevPop](uniCloud/cf-database.md?id=stddevpop) |stdDevPop(<表达式>) |- | +|stdDevSamp |[stdDevSamp](uniCloud/cf-database.md?id=stddevsamp) |stdDevSamp(<表达式>) |- | +|sum |[sum](uniCloud/cf-database.md?id=sum) |sum(<表达式>) |- | +|mergeObjects |[mergeObjects](uniCloud/cf-database.md?id=mergeobjects)|mergeObjects(<表达式1>)|在groupField内使用时仅接收一个参数 | \ No newline at end of file