|
uniCloud的云數(shù)據(jù)庫,提供了一批強大的運算方法。這些方法是數(shù)據(jù)庫執(zhí)行的,而不是云函數(shù)執(zhí)行的。 這些運算方法是與數(shù)據(jù)查詢搭配使用的,它們可以對字段的值或字段的值的一部分進行運算,將運算后的結(jié)果返回給查詢請求。 數(shù)據(jù)庫運算方法,提供了比傳統(tǒng)SQL更大強大和靈活的查詢??梢詫崿F(xiàn)更多功能、可以一次性查詢出期待的結(jié)果。不必多次查庫多次運算,那樣不僅代碼復雜,而且會造成多次查庫性能下降;如果使用計費云空間,使用這些方法還可以減少數(shù)據(jù)庫查詢次數(shù)。 比如sum()方法,可以對多行記錄的某個字段值求和、可以對單行記錄的若干字段的值求和,如果字段是一個數(shù)組,還可以對數(shù)組的各項求和。 為方便書寫,clientDB內(nèi)將數(shù)據(jù)庫運算方法的用法進行了簡化(相對于云函數(shù)內(nèi)使用數(shù)據(jù)庫運算方法而言),主要是參數(shù)攤平,以字符串方式表達。以下是可以在clientDB中使用的數(shù)據(jù)庫運算方法 | 運算方法 | 用途 | JQL簡化用法 | 說明 |
|---|
| abs | 返回一個數(shù)字的絕對值 | abs(表達式) | - | | add | 將數(shù)字相加或?qū)?shù)字加在日期上。如果參數(shù)中的其中一個值是日期,那么其他值將被視為毫秒數(shù)加在該日期上 | add(表達式1,表達式2) | - | | ceil | 向上取整 | ceil(表達式) | - | | divide | 傳入被除數(shù)和除數(shù),求商 | divide(表達式1,表達式2) | - | | exp | 取 e(自然對數(shù)的底數(shù),歐拉數(shù)) 的 n 次方 | exp(表達式) | - | | floor | 向下取整 | floor(表達式) | - | | ln | 計算給定數(shù)字在自然對數(shù)值 | ln(表達式) | - | | log | 計算給定數(shù)字在給定對數(shù)底下的 log 值 | log(表達式1,表達式2) | - | | log10 | 計算給定數(shù)字在對數(shù)底為 10 下的 log 值 | log10(表達式) | - | | mod | 取模運算,第一個數(shù)字是被除數(shù),第二個數(shù)字是除數(shù) | mod(表達式1,表達式2) | - | | multiply | 取傳入的數(shù)字參數(shù)相乘的結(jié)果 | multiply(表達式1,表達式2) | - | | pow | 求給定基數(shù)的指數(shù)次冪 | pow(表達式1,表達式2) | - | | sqrt | 求平方根 | sqrt(表達式1,表達式2) | - | | subtract | 將兩個數(shù)字相減然后返回差值,或?qū)蓚€日期相減然后返回相差的毫秒數(shù),或?qū)⒁粋€日期減去一個數(shù)字返回結(jié)果的日期。 | subtract(表達式1,表達式2) | - | | trunc | 將數(shù)字截斷為整形 | trunc(表達式) | - | | arrayElemAt | 返回在指定數(shù)組下標的元素 | arrayElemAt(表達式1,表達式2) | - | | arrayToObject | 將一個數(shù)組轉(zhuǎn)換為對象 | arrayToObject(表達式) | - | | concatArrays | 將多個數(shù)組拼接成一個數(shù)組 | concatArrays(表達式1,表達式2) | - | | filter | 根據(jù)給定條件返回滿足條件的數(shù)組的子集 | filter(input,as,cond) | - | | in | 給定一個值和一個數(shù)組,如果值在數(shù)組中則返回 true,否則返回 false | in(表達式1,表達式2) | - | | indexOfArray | 在數(shù)組中找出等于給定值的第一個元素的下標,如果找不到則返回 -1 | indexOfArray(表達式1,表達式2) | - | | isArray | 判斷給定表達式是否是數(shù)組,返回布爾值 | isArray(表達式) | - | | map | 類似 JavaScript Array 上的 map 方法,將給定數(shù)組的每個元素按給定轉(zhuǎn)換方法轉(zhuǎn)換后得出新的數(shù)組 | map(input,as,in) | - | | objectToArray | 將一個對象轉(zhuǎn)換為數(shù)組。方法把對象的每個鍵值對都變成輸出數(shù)組的一個元素,元素形如 { k: <key>, v: <value> } | objectToArray(表達式) | - | | range | 返回一組生成的序列數(shù)字。給定開始值、結(jié)束值、非零的步長,range 會返回從開始值開始逐步增長、步長為給定步長、但不包括結(jié)束值的序列。 | range(表達式1,表達式2) | - | | reduce | 類似 JavaScript 的 reduce 方法,應用一個表達式于數(shù)組各個元素然后歸一成一個元素 | reduce(input,initialValue,in) | - | | reverseArray | 返回給定數(shù)組的倒序形式 | reverseArray(表達式) | - | | size | 返回數(shù)組長度 | size(表達式) | - | | slice | 類似 JavaScritp 的 slice 方法。返回給定數(shù)組的指定子集 | slice(表達式1,表達式2) | - | | zip | 把二維數(shù)組的第二維數(shù)組中的相同序號的元素分別拼裝成一個新的數(shù)組進而組裝成一個新的二維數(shù)組。 | zip(inputs,useLongestLength,defaults) | - | | and | 給定多個表達式,and 僅在所有表達式都返回 true 時返回 true,否則返回 false | and(表達式1,表達式2) | - | | not | 給定一個表達式,如果表達式返回 true,則 not 返回 false,否則返回 true。注意表達式不能為邏輯表達式(and、or、nor、not) | not(表達式) | - | | or | 給定多個表達式,如果任意一個表達式返回 true,則 or 返回 true,否則返回 false | or(表達式1,表達式2) | - | | cmp | 給定兩個值,返回其比較值。如果第一個值小于第二個值,返回 -1 如果第一個值大于第二個值,返回 1 如果兩個值相等,返回 0 | cmp(表達式1,表達式2) | - | | eq | 匹配兩個值,如果相等則返回 true,否則返回 false | eq(表達式1,表達式2) | - | | gt | 匹配兩個值,如果前者大于后者則返回 true,否則返回 false | gt(表達式1,表達式2) | - | | gte | 匹配兩個值,如果前者大于或等于后者則返回 true,否則返回 false | gte(表達式1,表達式2) | - | | lt | 匹配兩個值,如果前者小于后者則返回 true,否則返回 false | lt(表達式1,表達式2) | - | | lte | 匹配兩個值,如果前者小于或等于后者則返回 true,否則返回 false | lte(表達式1,表達式2) | - | | neq | 匹配兩個值,如果不相等則返回 true,否則返回 false | neq(表達式1,表達式2) | - | | cond | 計算布爾表達式,返回指定的兩個值其中之一 | cond(表達式1,表達式2) | - | | ifNull | 計算給定的表達式,如果表達式結(jié)果為 null、undefined 或者不存在,那么返回一個替代值;否則返回原值。 | ifNull(表達式1,表達式2) | - | | switch | 根據(jù)給定的 switch-case-default 計算返回值 | switch(branches,default) | - | | dateFromParts | 給定日期的相關信息,構建并返回一個日期對象 | dateFromParts(year,month,day,hour,minute,second,millisecond,timezone) | - | | isoDateFromParts | 給定日期的相關信息,構建并返回一個日期對象 | isoDateFromParts(isoWeekYear,isoWeek,isoDayOfWeek,hour,minute,second,millisecond,timezone) | - | | dateFromString | 將一個日期/時間字符串轉(zhuǎn)換為日期對象 | dateFromString(dateString,format,timezone,onError,onNull) | - | | dateToString | 根據(jù)指定的表達式將日期對象格式化為符合要求的字符串 | dateToString(date,format,timezone,onNull) | - | | dayOfMonth | 返回日期字段對應的天數(shù)(一個月中的哪一天),是一個介于 1 至 31 之間的數(shù)字 | dayOfMonth(date,timezone) | - | | dayOfWeek | 返回日期字段對應的天數(shù)(一周中的第幾天),是一個介于 1(周日)到 7(周六)之間的整數(shù) | dayOfWeek(date,timezone) | - | | dayOfYear | 返回日期字段對應的天數(shù)(一年中的第幾天),是一個介于 1 到 366 之間的整數(shù) | dayOfYear(date,timezone) | - | | hour | 返回日期字段對應的小時數(shù),是一個介于 0 到 23 之間的整數(shù)。 | hour(date,timezone) | - | | isoDayOfWeek | 返回日期字段對應的 ISO 8601 標準的天數(shù)(一周中的第幾天),是一個介于 1(周一)到 7(周日)之間的整數(shù)。 | isoDayOfWeek(date,timezone) | - | | isoWeek | 返回日期字段對應的 ISO 8601 標準的周數(shù)(一年中的第幾周),是一個介于 1 到 53 之間的整數(shù)。 | isoWeek(date,timezone) | - | | isoWeekYear | 返回日期字段對應的 ISO 8601 標準的天數(shù)(一年中的第幾天) | isoWeekYear(date,timezone) | - | | millisecond | 返回日期字段對應的毫秒數(shù),是一個介于 0 到 999 之間的整數(shù) | millisecond(date,timezone) | - | | minute | 返回日期字段對應的分鐘數(shù),是一個介于 0 到 59 之間的整數(shù) | minute(date,timezone) | - | | month | 返回日期字段對應的月份,是一個介于 1 到 12 之間的整數(shù) | month(date,timezone) | - | | second | 返回日期字段對應的秒數(shù),是一個介于 0 到 59 之間的整數(shù),在特殊情況下(閏秒)可能等于 60 | second(date,timezone) | - | | week | 返回日期字段對應的周數(shù)(一年中的第幾周),是一個介于 0 到 53 之間的整數(shù) | week(date,timezone) | - | | year | 返回日期字段對應的年份 | year(date,timezone) | - | | timestampToDate | 傳入一個時間戳,返回對應的日期對象 | timestampToDate(timestamp) | 僅JQL字符串內(nèi)支持,HBuilderX 3.1.0起支持 | | literal | 直接返回一個值的字面量,不經(jīng)過任何解析和處理 | literal(表達式) | - | | mergeObjects | 將多個對象合并為單個對象 | mergeObjects(表達式1,表達式2) | - | | allElementsTrue | 輸入一個數(shù)組,或者數(shù)組字段的表達式。如果數(shù)組中所有元素均為真值,那么返回 true,否則返回 false??諗?shù)組永遠返回 true | allElementsTrue(表達式1,表達式2) | - | | anyElementTrue | 輸入一個數(shù)組,或者數(shù)組字段的表達式。如果數(shù)組中任意一個元素為真值,那么返回 true,否則返回 false??諗?shù)組永遠返回 false | anyElementTrue(表達式1,表達式2) | - | | setDifference | 輸入兩個集合,輸出只存在于第一個集合中的元素 | setDifference(表達式1,表達式2) | - | | setEquals | 輸入兩個集合,判斷兩個集合中包含的元素是否相同(不考慮順序、去重) | setEquals(表達式1,表達式2) | - | | setIntersection | 輸入兩個集合,輸出兩個集合的交集 | setIntersection(表達式1,表達式2) | - | | setIsSubset | 輸入兩個集合,判斷第一個集合是否是第二個集合的子集 | setIsSubset(表達式1,表達式2) | - | | setUnion | 輸入兩個集合,輸出兩個集合的并集 | setUnion(表達式1,表達式2) | - | | concat | 連接字符串,返回拼接后的字符串 | concat(表達式1,表達式2) | - | | indexOfBytes | 在目標字符串中查找子字符串,并返回第一次出現(xiàn)的 UTF-8 的字節(jié)索引(從0開始)。如果不存在子字符串,返回 -1 | indexOfBytes(表達式1,表達式2) | - | | indexOfCP | 在目標字符串中查找子字符串,并返回第一次出現(xiàn)的 UTF-8 的 code point 索引(從0開始)。如果不存在子字符串,返回 -1 | indexOfCP(表達式1,表達式2) | - | | split | 按照分隔符分隔數(shù)組,并且刪除分隔符,返回子字符串組成的數(shù)組。如果字符串無法找到分隔符進行分隔,返回原字符串作為數(shù)組的唯一元素 | split(表達式1,表達式2) | - | | strLenBytes | 計算并返回指定字符串中 utf-8 編碼的字節(jié)數(shù)量 | strLenBytes(表達式) | - | | strLenCP | 計算并返回指定字符串的UTF-8 code points 數(shù)量 | strLenCP(表達式) | - | | strcasecmp | 對兩個字符串在不區(qū)分大小寫的情況下進行大小比較,并返回比較的結(jié)果 | strcasecmp(表達式1,表達式2) | - | | substr | 返回字符串從指定位置開始的指定長度的子字符串 | substr(表達式1,表達式2) | - | | substrBytes | 返回字符串從指定位置開始的指定長度的子字符串。子字符串是由字符串中指定的 UTF-8 字節(jié)索引的字符開始,長度為指定的字節(jié)數(shù) | substrBytes(表達式1,表達式2) | - | | substrCP | 返回字符串從指定位置開始的指定長度的子字符串。子字符串是由字符串中指定的 UTF-8 字節(jié)索引的字符開始,長度為指定的字節(jié)數(shù) | substrCP(表達式1,表達式2) | - | | toLower | 將字符串轉(zhuǎn)化為小寫并返回 | toLower(表達式) | - | | toUpper | 將字符串轉(zhuǎn)化為大寫并返回 | toUpper(表達式) | - | | addToSet | 聚合運算符。向數(shù)組中添加值,如果數(shù)組中已存在該值,不執(zhí)行任何操作。它只能在 group stage 中使用 | addToSet(表達式) | - | | avg | 返回指定表達式對應數(shù)據(jù)的平均值 | avg(表達式) | - | | first | 返回指定字段在一組集合的第一條記錄對應的值。僅當這組集合是按照某種定義排序( sort )后,此操作才有意義 | first(表達式) | - | | last | 返回指定字段在一組集合的最后一條記錄對應的值。僅當這組集合是按照某種定義排序( sort )后,此操作才有意義。 | last(表達式) | - | | max | 返回一組數(shù)值的最大值 | max(表達式) | - | | min | 返回一組數(shù)值的最小值 | min(表達式) | - | | push | 返回一組中表達式指定列與對應的值,一起組成的數(shù)組 | push(表達式) | - | | stdDevPop | 返回一組字段對應值的標準差 | stdDevPop(表達式) | - | | stdDevSamp | 計算輸入值的樣本標準偏差 | stdDevSamp(表達式) | - | | sum | 在groupField內(nèi)返回一組字段所有數(shù)值的總和,非groupField內(nèi)返回一個數(shù)組所有元素的和 | sum(表達式) | - | | let | 自定義變量,并且在指定表達式中使用,返回的結(jié)果是表達式的結(jié)果 | let(vars,in) | - |
以上操作符還可以組合使用 例:數(shù)據(jù)表article內(nèi)有以下數(shù)據(jù) {
"_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字段從時間戳轉(zhuǎn)為2021-01-20形式,然后進行按天進行統(tǒng)計 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時間戳轉(zhuǎn)為日期類型,再用dateToString將上一步的日期按照時區(qū)'+0800'(北京時間),格式化為4位年-2位月-2位日格式,完整格式化參數(shù)請參考dateToString。 上述代碼執(zhí)行結(jié)果為 res = {
result: {
data: [{
publish_date_str: '2021-01-20',
total: 3
}]
}
}分組運算方法是專用于統(tǒng)計匯總的數(shù)據(jù)庫運算方法。它也是數(shù)據(jù)庫的方法,而不是js的方法。 等同于mongoDB累計器操作符概念 groupField內(nèi)可使用且僅能使用如下運算方法。 | 操作符 | 用途 | 用法 | 說明 |
|---|
| addToSet | 向數(shù)組中添加值,如果數(shù)組中已存在該值,不執(zhí)行任何操作 | addToSet(表達式) | - | | avg | 返回指定表達式對應數(shù)據(jù)的平均值 | avg(表達式) | - | | first | 返回指定字段在一組集合的第一條記錄對應的值。僅當這組集合是按照某種定義排序( sort )后,此操作才有意義 | first(表達式) | - | | last | 返回指定字段在一組集合的最后一條記錄對應的值。僅當這組集合是按照某種定義排序( sort )后,此操作才有意義。 | last(表達式) | - | | max | 返回一組數(shù)值的最大值 | max(表達式) | - | | min | 返回一組數(shù)值的最小值 | min(表達式) | - | | push | 返回一組中表達式指定列與對應的值,一起組成的數(shù)組 | push(表達式) | - | | stdDevPop | 返回一組字段對應值的標準差 | stdDevPop(表達式) | - | | stdDevSamp | 計算輸入值的樣本標準偏差 | stdDevSamp(表達式) | - | | sum | 返回一組字段所有數(shù)值的總和 | sum(表達式) | - | | mergeObjects | 將一組對象合并為一個對象 | mergeObjects(表達式) | 在groupField內(nèi)使用時僅接收一個參數(shù) |
|