电竞比分网-中国电竞赛事及体育赛事平台

分享

前端操作數(shù)據(jù)庫的API及JQL語法

 新用戶6018vWES 2021-04-03

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,否則返回 falsein(表達式1,表達式2)-
indexOfArray在數(shù)組中找出等于給定值的第一個元素的下標,如果找不到則返回 -1indexOfArray(表達式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,否則返回 falseand(表達式1,表達式2)-
not給定一個表達式,如果表達式返回 true,則 not 返回 false,否則返回 true。注意表達式不能為邏輯表達式(and、or、nor、not)not(表達式)-
or給定多個表達式,如果任意一個表達式返回 true,則 or 返回 true,否則返回 falseor(表達式1,表達式2)-
cmp給定兩個值,返回其比較值。如果第一個值小于第二個值,返回 -1 如果第一個值大于第二個值,返回 1 如果兩個值相等,返回 0cmp(表達式1,表達式2)-
eq匹配兩個值,如果相等則返回 true,否則返回 falseeq(表達式1,表達式2)-
gt匹配兩個值,如果前者大于后者則返回 true,否則返回 falsegt(表達式1,表達式2)-
gte匹配兩個值,如果前者大于或等于后者則返回 true,否則返回 falsegte(表達式1,表達式2)-
lt匹配兩個值,如果前者小于后者則返回 true,否則返回 falselt(表達式1,表達式2)-
lte匹配兩個值,如果前者小于或等于后者則返回 true,否則返回 falselte(表達式1,表達式2)-
neq匹配兩個值,如果不相等則返回 true,否則返回 falseneq(表達式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ù),在特殊情況下(閏秒)可能等于 60second(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ù)組永遠返回 trueallElementsTrue(表達式1,表達式2)-
anyElementTrue輸入一個數(shù)組,或者數(shù)組字段的表達式。如果數(shù)組中任意一個元素為真值,那么返回 true,否則返回 false??諗?shù)組永遠返回 falseanyElementTrue(表達式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開始)。如果不存在子字符串,返回 -1indexOfBytes(表達式1,表達式2)-
indexOfCP在目標字符串中查找子字符串,并返回第一次出現(xiàn)的 UTF-8 的 code point 索引(從0開始)。如果不存在子字符串,返回 -1indexOfCP(表達式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ù)


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多