@cloudbase/database 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -10
- package/dist/commonjs/ObjectId/index.d.ts +11 -0
- package/dist/commonjs/ObjectId/index.js +21 -0
- package/dist/commonjs/aggregate.d.ts +29 -29
- package/dist/commonjs/aggregate.js +124 -124
- package/dist/commonjs/collection.d.ts +17 -17
- package/dist/commonjs/collection.js +72 -72
- package/dist/commonjs/command.d.ts +175 -175
- package/dist/commonjs/command.js +285 -285
- package/dist/commonjs/commands/logic.d.ts +24 -24
- package/dist/commonjs/commands/logic.js +79 -79
- package/dist/commonjs/commands/query.d.ts +73 -73
- package/dist/commonjs/commands/query.js +147 -147
- package/dist/commonjs/commands/update.d.ts +29 -29
- package/dist/commonjs/commands/update.js +49 -49
- package/dist/commonjs/config/app.config.d.ts +6 -6
- package/dist/commonjs/config/app.config.js +7 -7
- package/dist/commonjs/config/error.config.d.ts +3 -3
- package/dist/commonjs/config/error.config.js +15 -15
- package/dist/commonjs/const/code.d.ts +34 -34
- package/dist/commonjs/const/code.js +36 -36
- package/dist/commonjs/constant.d.ts +54 -54
- package/dist/commonjs/constant.js +76 -76
- package/dist/commonjs/document.d.ts +14 -14
- package/dist/commonjs/document.js +219 -219
- package/dist/commonjs/geo/index.d.ts +6 -6
- package/dist/commonjs/geo/index.js +11 -11
- package/dist/commonjs/geo/interface.d.ts +24 -24
- package/dist/commonjs/geo/interface.js +2 -2
- package/dist/commonjs/geo/lineString.d.ts +19 -19
- package/dist/commonjs/geo/lineString.js +57 -57
- package/dist/commonjs/geo/multiLineString.d.ts +18 -18
- package/dist/commonjs/geo/multiLineString.js +56 -56
- package/dist/commonjs/geo/multiPoint.d.ts +18 -18
- package/dist/commonjs/geo/multiPoint.js +50 -50
- package/dist/commonjs/geo/multiPolygon.d.ts +18 -18
- package/dist/commonjs/geo/multiPolygon.js +62 -62
- package/dist/commonjs/geo/point.d.ts +19 -19
- package/dist/commonjs/geo/point.js +43 -43
- package/dist/commonjs/geo/polygon.d.ts +19 -19
- package/dist/commonjs/geo/polygon.js +70 -70
- package/dist/commonjs/helper/symbol.d.ts +15 -14
- package/dist/commonjs/helper/symbol.js +20 -19
- package/dist/commonjs/index.d.ts +50 -49
- package/dist/commonjs/index.js +41 -39
- package/dist/commonjs/operator-map.d.ts +4 -4
- package/dist/commonjs/operator-map.js +23 -23
- package/dist/commonjs/query.d.ts +38 -38
- package/dist/commonjs/query.js +247 -247
- package/dist/commonjs/realtime/error.d.ts +7 -7
- package/dist/commonjs/realtime/error.js +11 -11
- package/dist/commonjs/realtime/listener.d.ts +14 -14
- package/dist/commonjs/realtime/listener.js +17 -17
- package/dist/commonjs/realtime/message.d.ts +3 -3
- package/dist/commonjs/realtime/message.js +10 -10
- package/dist/commonjs/realtime/snapshot.d.ts +16 -16
- package/dist/commonjs/realtime/snapshot.js +42 -42
- package/dist/commonjs/realtime/virtual-websocket-client.d.ts +63 -63
- package/dist/commonjs/realtime/virtual-websocket-client.js +736 -736
- package/dist/commonjs/realtime/websocket-client.d.ts +78 -78
- package/dist/commonjs/realtime/websocket-client.js +567 -567
- package/dist/commonjs/realtime/ws-event.d.ts +126 -126
- package/dist/commonjs/realtime/ws-event.js +139 -139
- package/dist/commonjs/regexp/index.d.ts +18 -18
- package/dist/commonjs/regexp/index.js +30 -30
- package/dist/commonjs/serializer/common.d.ts +11 -11
- package/dist/commonjs/serializer/common.js +90 -90
- package/dist/commonjs/serializer/datatype.d.ts +7 -7
- package/dist/commonjs/serializer/datatype.js +99 -96
- package/dist/commonjs/serializer/query.d.ts +8 -8
- package/dist/commonjs/serializer/query.js +254 -254
- package/dist/commonjs/serializer/update.d.ts +16 -16
- package/dist/commonjs/serializer/update.js +142 -142
- package/dist/commonjs/serverDate/index.d.ts +13 -13
- package/dist/commonjs/serverDate/index.js +23 -23
- package/dist/commonjs/transaction/index.d.ts +30 -30
- package/dist/commonjs/transaction/index.js +105 -105
- package/dist/commonjs/transaction.d.ts +42 -42
- package/dist/commonjs/transaction.js +126 -126
- package/dist/commonjs/typings/index.d.ts +45 -45
- package/dist/commonjs/typings/index.js +2 -2
- package/dist/commonjs/typings/realtime.d.ts +219 -219
- package/dist/commonjs/typings/realtime.js +2 -2
- package/dist/commonjs/util.d.ts +9 -9
- package/dist/commonjs/util.js +101 -101
- package/dist/commonjs/utils/error.d.ts +37 -37
- package/dist/commonjs/utils/error.js +55 -55
- package/dist/commonjs/utils/symbol.d.ts +8 -8
- package/dist/commonjs/utils/symbol.js +39 -39
- package/dist/commonjs/utils/type.d.ts +13 -13
- package/dist/commonjs/utils/type.js +22 -22
- package/dist/commonjs/utils/utils.d.ts +19 -19
- package/dist/commonjs/utils/utils.js +59 -59
- package/dist/commonjs/validate.d.ts +1 -1
- package/dist/commonjs/validate.js +155 -155
- package/dist/esm/ObjectId/index.d.ts +11 -0
- package/dist/esm/ObjectId/index.js +17 -0
- package/dist/esm/aggregate.d.ts +29 -29
- package/dist/esm/aggregate.js +121 -121
- package/dist/esm/collection.d.ts +17 -17
- package/dist/esm/collection.js +69 -69
- package/dist/esm/command.d.ts +175 -175
- package/dist/esm/command.js +281 -281
- package/dist/esm/commands/logic.d.ts +24 -24
- package/dist/esm/commands/logic.js +74 -74
- package/dist/esm/commands/query.d.ts +73 -73
- package/dist/esm/commands/query.js +141 -141
- package/dist/esm/commands/update.d.ts +29 -29
- package/dist/esm/commands/update.js +44 -44
- package/dist/esm/config/app.config.d.ts +6 -6
- package/dist/esm/config/app.config.js +5 -5
- package/dist/esm/config/error.config.d.ts +3 -3
- package/dist/esm/config/error.config.js +13 -13
- package/dist/esm/const/code.d.ts +34 -34
- package/dist/esm/const/code.js +34 -34
- package/dist/esm/constant.d.ts +54 -54
- package/dist/esm/constant.js +67 -67
- package/dist/esm/document.d.ts +14 -14
- package/dist/esm/document.js +216 -216
- package/dist/esm/geo/index.d.ts +6 -6
- package/dist/esm/geo/index.js +6 -6
- package/dist/esm/geo/interface.d.ts +24 -24
- package/dist/esm/geo/lineString.d.ts +19 -19
- package/dist/esm/geo/lineString.js +54 -54
- package/dist/esm/geo/multiLineString.d.ts +18 -18
- package/dist/esm/geo/multiLineString.js +53 -53
- package/dist/esm/geo/multiPoint.d.ts +18 -18
- package/dist/esm/geo/multiPoint.js +47 -47
- package/dist/esm/geo/multiPolygon.d.ts +18 -18
- package/dist/esm/geo/multiPolygon.js +59 -59
- package/dist/esm/geo/point.d.ts +19 -19
- package/dist/esm/geo/point.js +40 -40
- package/dist/esm/geo/polygon.d.ts +19 -19
- package/dist/esm/geo/polygon.js +67 -67
- package/dist/esm/helper/symbol.d.ts +15 -14
- package/dist/esm/helper/symbol.js +15 -14
- package/dist/esm/index.d.ts +50 -49
- package/dist/esm/index.js +35 -33
- package/dist/esm/operator-map.d.ts +4 -4
- package/dist/esm/operator-map.js +20 -20
- package/dist/esm/query.d.ts +38 -38
- package/dist/esm/query.js +244 -244
- package/dist/esm/realtime/error.d.ts +7 -7
- package/dist/esm/realtime/error.js +8 -8
- package/dist/esm/realtime/listener.d.ts +14 -14
- package/dist/esm/realtime/listener.js +14 -14
- package/dist/esm/realtime/message.d.ts +3 -3
- package/dist/esm/realtime/message.js +6 -6
- package/dist/esm/realtime/snapshot.d.ts +16 -16
- package/dist/esm/realtime/snapshot.js +39 -39
- package/dist/esm/realtime/virtual-websocket-client.d.ts +63 -63
- package/dist/esm/realtime/virtual-websocket-client.js +733 -733
- package/dist/esm/realtime/websocket-client.d.ts +78 -78
- package/dist/esm/realtime/websocket-client.js +564 -564
- package/dist/esm/realtime/ws-event.d.ts +126 -126
- package/dist/esm/realtime/ws-event.js +137 -137
- package/dist/esm/regexp/index.d.ts +18 -18
- package/dist/esm/regexp/index.js +26 -26
- package/dist/esm/serializer/common.d.ts +11 -11
- package/dist/esm/serializer/common.js +82 -82
- package/dist/esm/serializer/datatype.d.ts +7 -7
- package/dist/esm/serializer/datatype.js +95 -92
- package/dist/esm/serializer/query.d.ts +8 -8
- package/dist/esm/serializer/query.js +251 -251
- package/dist/esm/serializer/update.d.ts +16 -16
- package/dist/esm/serializer/update.js +139 -139
- package/dist/esm/serverDate/index.d.ts +13 -13
- package/dist/esm/serverDate/index.js +19 -19
- package/dist/esm/transaction/index.d.ts +30 -30
- package/dist/esm/transaction/index.js +100 -100
- package/dist/esm/transaction.d.ts +42 -42
- package/dist/esm/transaction.js +121 -121
- package/dist/esm/typings/index.d.ts +45 -45
- package/dist/esm/typings/realtime.d.ts +219 -219
- package/dist/esm/util.d.ts +9 -9
- package/dist/esm/util.js +98 -98
- package/dist/esm/utils/error.d.ts +37 -37
- package/dist/esm/utils/error.js +49 -49
- package/dist/esm/utils/symbol.d.ts +8 -8
- package/dist/esm/utils/symbol.js +36 -36
- package/dist/esm/utils/type.d.ts +13 -13
- package/dist/esm/utils/type.js +20 -20
- package/dist/esm/utils/utils.d.ts +19 -19
- package/dist/esm/utils/utils.js +55 -55
- package/dist/esm/validate.d.ts +1 -1
- package/dist/esm/validate.js +152 -152
- package/package.json +1 -1
- package/src/ObjectId/index.ts +23 -0
- package/src/aggregate.ts +8 -5
- package/src/helper/symbol.ts +2 -0
- package/src/index.ts +4 -0
- package/src/serializer/datatype.ts +5 -1
- package/dist/commonjs/decimal128/index.d.ts +0 -8
- package/dist/commonjs/decimal128/index.js +0 -26
- package/dist/commonjs/lib/util.d.ts +0 -1
- package/dist/commonjs/lib/util.js +0 -25
- package/dist/commonjs/transaction/collection.d.ts +0 -7
- package/dist/commonjs/transaction/collection.js +0 -46
- package/dist/commonjs/transaction/document.d.ts +0 -27
- package/dist/commonjs/transaction/document.js +0 -205
- package/dist/commonjs/transaction/query.d.ts +0 -5
- package/dist/commonjs/transaction/query.js +0 -10
- package/dist/esm/lib/util.d.ts +0 -1
- package/dist/esm/lib/util.js +0 -23
- package/dist/esm/transaction/collection.d.ts +0 -7
- package/dist/esm/transaction/collection.js +0 -44
- package/dist/esm/transaction/document.d.ts +0 -27
- package/dist/esm/transaction/document.js +0 -203
- package/dist/esm/transaction/query.d.ts +0 -5
- package/dist/esm/transaction/query.js +0 -8
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ yarn add @cloudbase/database
|
|
|
15
15
|
|
|
16
16
|
## 使用
|
|
17
17
|
|
|
18
|
-
使用 `@cloudbase/database` 时,需要提供发送请求的类 `reqClass`。
|
|
18
|
+
使用 `@cloudbase/database` 时,需要提供发送请求的类 `reqClass`。
|
|
19
19
|
|
|
20
20
|
```js
|
|
21
21
|
// index.js
|
|
@@ -38,23 +38,23 @@ class Tcb {
|
|
|
38
38
|
// request.js
|
|
39
39
|
|
|
40
40
|
// 进一步处理,鉴权等...
|
|
41
|
-
const requestHandler = require('requestHandler')
|
|
41
|
+
const requestHandler = require('requestHandler')
|
|
42
42
|
|
|
43
43
|
class Request {
|
|
44
44
|
constructor(config) {
|
|
45
|
-
this.config = config
|
|
45
|
+
this.config = config
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
async send(action, data) {
|
|
49
49
|
const params = Object.assign({}, data, {
|
|
50
50
|
action
|
|
51
|
-
})
|
|
51
|
+
})
|
|
52
52
|
|
|
53
53
|
const slowQueryWarning = setTimeout(() => {
|
|
54
54
|
console.warn(
|
|
55
55
|
'Database operation is longer than 3s. Please check query performance and your network environment.'
|
|
56
|
-
)
|
|
57
|
-
}, 3000)
|
|
56
|
+
)
|
|
57
|
+
}, 3000)
|
|
58
58
|
|
|
59
59
|
try {
|
|
60
60
|
return await requestHandler({
|
|
@@ -65,14 +65,14 @@ class Request {
|
|
|
65
65
|
headers: {
|
|
66
66
|
'content-type': 'application/json'
|
|
67
67
|
}
|
|
68
|
-
})
|
|
68
|
+
})
|
|
69
69
|
} finally {
|
|
70
|
-
clearTimeout(slowQueryWarning)
|
|
70
|
+
clearTimeout(slowQueryWarning)
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
module.exports = Request
|
|
75
|
+
module.exports = Request
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
请求数据样例
|
|
@@ -94,4 +94,26 @@ module.exports = Request;
|
|
|
94
94
|
},
|
|
95
95
|
"json": true
|
|
96
96
|
}
|
|
97
|
-
```
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 开发指南
|
|
100
|
+
|
|
101
|
+
### 注意
|
|
102
|
+
|
|
103
|
+
当前 database 库是通过分支来控制了两个不同的版本,主干版提供给@cloudbase/js-sdk 库使用,feature/support_db_2.0 分支提供给@cloudbase/node-sdk 库使用。
|
|
104
|
+
|
|
105
|
+
两个分支区别:
|
|
106
|
+
support_db_2.0 分支进行了数据库接口的升级,将原有的 json 协议转换为 mongo 支持的 bson 协议处理,目的是解决旧接口存在的问题,描述如下
|
|
107
|
+
|
|
108
|
+
- 日期对象 是走约定协议处理,即转换为 {$date: timestamp},这种方式应摒弃(EJSON 协议可解决)
|
|
109
|
+
- 无法支持 null, NaN 等特殊类型处理(EJSON 协议可解决)
|
|
110
|
+
- serverDate 这种自定义类型的实现,是继续保留 还是摒弃
|
|
111
|
+
- 接口实现混杂,普通 CRUD 接口均走 flexdb,而聚合,事务又用 runcommand 方式
|
|
112
|
+
- 原插入文档接口返回 docId 形式混杂
|
|
113
|
+
|
|
114
|
+
目前仅针对服务端 sdk @cloudbase/node-sdk 完成了升级,而客户端 sdk @cloudbase/js-sdk 以及 小程序端 SDK 仍保留为旧接口形式。
|
|
115
|
+
|
|
116
|
+
### 开发及发布事项
|
|
117
|
+
|
|
118
|
+
1. 数据库接口的改动务必补充测试用例验证
|
|
119
|
+
2. 发布时,约定 feature/support_db_2.0 分支上发布正式版(for @cloudbase/node-sdk)使用,master 分支上发布 beta 版 (for @cloudbase/js-sdk)使用。两 sdk 均通过锁版本方式依赖该库,不会受自动更新依赖影响。
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class ObjectId {
|
|
2
|
+
id: string;
|
|
3
|
+
constructor({ id }?: {
|
|
4
|
+
id?: string;
|
|
5
|
+
});
|
|
6
|
+
readonly _internalType: import("../utils/symbol").InternalSymbol;
|
|
7
|
+
parse(): {
|
|
8
|
+
$oid: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function ObjectIdConstructor(opt: any): ObjectId;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const symbol_1 = require("../helper/symbol");
|
|
4
|
+
class ObjectId {
|
|
5
|
+
constructor({ id = '' } = {}) {
|
|
6
|
+
this.id = id;
|
|
7
|
+
}
|
|
8
|
+
get _internalType() {
|
|
9
|
+
return symbol_1.SYMBOL_OBJECTID;
|
|
10
|
+
}
|
|
11
|
+
parse() {
|
|
12
|
+
return {
|
|
13
|
+
$oid: this.id
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.ObjectId = ObjectId;
|
|
18
|
+
function ObjectIdConstructor(opt) {
|
|
19
|
+
return new ObjectId(opt);
|
|
20
|
+
}
|
|
21
|
+
exports.ObjectIdConstructor = ObjectIdConstructor;
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
export default class Aggregation {
|
|
2
|
-
_db: any;
|
|
3
|
-
_request: any;
|
|
4
|
-
_stages: any[];
|
|
5
|
-
_collectionName: string;
|
|
6
|
-
constructor(db?: any, collectionName?: any, rawPipeline?: any);
|
|
7
|
-
end(): Promise<any>;
|
|
8
|
-
unwrap(): any[];
|
|
9
|
-
done(): {
|
|
10
|
-
[x: number]: any;
|
|
11
|
-
}[];
|
|
12
|
-
_pipe(stage: any, param: any, raw?: boolean): this;
|
|
13
|
-
addFields(param: any): this;
|
|
14
|
-
bucket(param: any): this;
|
|
15
|
-
bucketAuto(param: any): this;
|
|
16
|
-
count(param: any): this;
|
|
17
|
-
geoNear(param: any): this;
|
|
18
|
-
group(param: any): this;
|
|
19
|
-
limit(param: any): this;
|
|
20
|
-
match(param: any): this;
|
|
21
|
-
project(param: any): this;
|
|
22
|
-
lookup(param: any): this;
|
|
23
|
-
replaceRoot(param: any): this;
|
|
24
|
-
sample(param: any): this;
|
|
25
|
-
skip(param: any): this;
|
|
26
|
-
sort(param: any): this;
|
|
27
|
-
sortByCount(param: any): this;
|
|
28
|
-
unwind(param: any): this;
|
|
29
|
-
}
|
|
1
|
+
export default class Aggregation {
|
|
2
|
+
_db: any;
|
|
3
|
+
_request: any;
|
|
4
|
+
_stages: any[];
|
|
5
|
+
_collectionName: string;
|
|
6
|
+
constructor(db?: any, collectionName?: any, rawPipeline?: any);
|
|
7
|
+
end(): Promise<any>;
|
|
8
|
+
unwrap(): any[];
|
|
9
|
+
done(): {
|
|
10
|
+
[x: number]: any;
|
|
11
|
+
}[];
|
|
12
|
+
_pipe(stage: any, param: any, raw?: boolean): this;
|
|
13
|
+
addFields(param: any): this;
|
|
14
|
+
bucket(param: any): this;
|
|
15
|
+
bucketAuto(param: any): this;
|
|
16
|
+
count(param: any): this;
|
|
17
|
+
geoNear(param: any): this;
|
|
18
|
+
group(param: any): this;
|
|
19
|
+
limit(param: any): this;
|
|
20
|
+
match(param: any): this;
|
|
21
|
+
project(param: any): this;
|
|
22
|
+
lookup(param: any): this;
|
|
23
|
+
replaceRoot(param: any): this;
|
|
24
|
+
sample(param: any): this;
|
|
25
|
+
skip(param: any): this;
|
|
26
|
+
sort(param: any): this;
|
|
27
|
+
sortByCount(param: any): this;
|
|
28
|
+
unwind(param: any): this;
|
|
29
|
+
}
|
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const index_1 = require("./index");
|
|
4
|
-
const bson_1 = require("bson");
|
|
5
|
-
const query_1 = require("./serializer/query");
|
|
6
|
-
const utils_1 = require("./utils/utils");
|
|
7
|
-
const type_1 = require("./utils/type");
|
|
8
|
-
const validate_1 = require("./validate");
|
|
9
|
-
const
|
|
10
|
-
class Aggregation {
|
|
11
|
-
constructor(db, collectionName, rawPipeline) {
|
|
12
|
-
this._stages = [];
|
|
13
|
-
if (db && collectionName) {
|
|
14
|
-
this._db = db;
|
|
15
|
-
this._request = new index_1.Db.reqClass(this._db.config);
|
|
16
|
-
this._collectionName = collectionName;
|
|
17
|
-
if (rawPipeline && rawPipeline.length > 0) {
|
|
18
|
-
rawPipeline.forEach((stage) => {
|
|
19
|
-
validate_1.Validate.isValidAggregation(stage);
|
|
20
|
-
const stageName = Object.keys(stage)[0];
|
|
21
|
-
this._pipe(stageName, stage[stageName], true);
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async end() {
|
|
27
|
-
if (!this._collectionName || !this._db) {
|
|
28
|
-
throw new Error('Aggregation pipeline cannot send request');
|
|
29
|
-
}
|
|
30
|
-
const result = await this._request.send('database.aggregateDocuments', {
|
|
31
|
-
collectionName: this._collectionName,
|
|
32
|
-
stages: this._stages
|
|
33
|
-
});
|
|
34
|
-
if (result && result.data && result.data.list) {
|
|
35
|
-
return {
|
|
36
|
-
requestId: result.requestId,
|
|
37
|
-
data: result.data.list.map(bson_1.EJSON.parse)
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
unwrap() {
|
|
43
|
-
return this._stages;
|
|
44
|
-
}
|
|
45
|
-
done() {
|
|
46
|
-
return this._stages.map(({ stageKey, stageValue }) => {
|
|
47
|
-
return {
|
|
48
|
-
[stageKey]: JSON.parse(stageValue)
|
|
49
|
-
};
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
_pipe(stage, param, raw = false) {
|
|
53
|
-
let transformParam = '';
|
|
54
|
-
if (type_1.getType(param) === 'object') {
|
|
55
|
-
transformParam = utils_1.stringifyByEJSON(param);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
transformParam = JSON.stringify(param);
|
|
59
|
-
}
|
|
60
|
-
this._stages.push({
|
|
61
|
-
stageKey: raw ? stage : `$${stage}`,
|
|
62
|
-
stageValue: transformParam
|
|
63
|
-
});
|
|
64
|
-
return this;
|
|
65
|
-
}
|
|
66
|
-
addFields(param) {
|
|
67
|
-
return this._pipe('addFields', param);
|
|
68
|
-
}
|
|
69
|
-
bucket(param) {
|
|
70
|
-
return this._pipe('bucket', param);
|
|
71
|
-
}
|
|
72
|
-
bucketAuto(param) {
|
|
73
|
-
return this._pipe('bucketAuto', param);
|
|
74
|
-
}
|
|
75
|
-
count(param) {
|
|
76
|
-
return this._pipe('count', param);
|
|
77
|
-
}
|
|
78
|
-
geoNear(param) {
|
|
79
|
-
if (param.query) {
|
|
80
|
-
param.query = query_1.QuerySerializer.encode(param.query);
|
|
81
|
-
}
|
|
82
|
-
if (param.distanceMultiplier && typeof (param.distanceMultiplier) === 'number') {
|
|
83
|
-
param.distanceMultiplier = param.distanceMultiplier
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
param.
|
|
87
|
-
}
|
|
88
|
-
return this._pipe('geoNear', param);
|
|
89
|
-
}
|
|
90
|
-
group(param) {
|
|
91
|
-
return this._pipe('group', param);
|
|
92
|
-
}
|
|
93
|
-
limit(param) {
|
|
94
|
-
return this._pipe('limit', param);
|
|
95
|
-
}
|
|
96
|
-
match(param) {
|
|
97
|
-
return this._pipe('match', query_1.QuerySerializer.encode(param));
|
|
98
|
-
}
|
|
99
|
-
project(param) {
|
|
100
|
-
return this._pipe('project', param);
|
|
101
|
-
}
|
|
102
|
-
lookup(param) {
|
|
103
|
-
return this._pipe('lookup', param);
|
|
104
|
-
}
|
|
105
|
-
replaceRoot(param) {
|
|
106
|
-
return this._pipe('replaceRoot', param);
|
|
107
|
-
}
|
|
108
|
-
sample(param) {
|
|
109
|
-
return this._pipe('sample', param);
|
|
110
|
-
}
|
|
111
|
-
skip(param) {
|
|
112
|
-
return this._pipe('skip', param);
|
|
113
|
-
}
|
|
114
|
-
sort(param) {
|
|
115
|
-
return this._pipe('sort', param);
|
|
116
|
-
}
|
|
117
|
-
sortByCount(param) {
|
|
118
|
-
return this._pipe('sortByCount', param);
|
|
119
|
-
}
|
|
120
|
-
unwind(param) {
|
|
121
|
-
return this._pipe('unwind', param);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
exports.default = Aggregation;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("./index");
|
|
4
|
+
const bson_1 = require("bson");
|
|
5
|
+
const query_1 = require("./serializer/query");
|
|
6
|
+
const utils_1 = require("./utils/utils");
|
|
7
|
+
const type_1 = require("./utils/type");
|
|
8
|
+
const validate_1 = require("./validate");
|
|
9
|
+
const point_1 = require("./geo/point");
|
|
10
|
+
class Aggregation {
|
|
11
|
+
constructor(db, collectionName, rawPipeline) {
|
|
12
|
+
this._stages = [];
|
|
13
|
+
if (db && collectionName) {
|
|
14
|
+
this._db = db;
|
|
15
|
+
this._request = new index_1.Db.reqClass(this._db.config);
|
|
16
|
+
this._collectionName = collectionName;
|
|
17
|
+
if (rawPipeline && rawPipeline.length > 0) {
|
|
18
|
+
rawPipeline.forEach((stage) => {
|
|
19
|
+
validate_1.Validate.isValidAggregation(stage);
|
|
20
|
+
const stageName = Object.keys(stage)[0];
|
|
21
|
+
this._pipe(stageName, stage[stageName], true);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async end() {
|
|
27
|
+
if (!this._collectionName || !this._db) {
|
|
28
|
+
throw new Error('Aggregation pipeline cannot send request');
|
|
29
|
+
}
|
|
30
|
+
const result = await this._request.send('database.aggregateDocuments', {
|
|
31
|
+
collectionName: this._collectionName,
|
|
32
|
+
stages: this._stages
|
|
33
|
+
});
|
|
34
|
+
if (result && result.data && result.data.list) {
|
|
35
|
+
return {
|
|
36
|
+
requestId: result.requestId,
|
|
37
|
+
data: result.data.list.map(bson_1.EJSON.parse)
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
unwrap() {
|
|
43
|
+
return this._stages;
|
|
44
|
+
}
|
|
45
|
+
done() {
|
|
46
|
+
return this._stages.map(({ stageKey, stageValue }) => {
|
|
47
|
+
return {
|
|
48
|
+
[stageKey]: JSON.parse(stageValue)
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
_pipe(stage, param, raw = false) {
|
|
53
|
+
let transformParam = '';
|
|
54
|
+
if (type_1.getType(param) === 'object') {
|
|
55
|
+
transformParam = utils_1.stringifyByEJSON(param);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
transformParam = JSON.stringify(param);
|
|
59
|
+
}
|
|
60
|
+
this._stages.push({
|
|
61
|
+
stageKey: raw ? stage : `$${stage}`,
|
|
62
|
+
stageValue: transformParam
|
|
63
|
+
});
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
addFields(param) {
|
|
67
|
+
return this._pipe('addFields', param);
|
|
68
|
+
}
|
|
69
|
+
bucket(param) {
|
|
70
|
+
return this._pipe('bucket', param);
|
|
71
|
+
}
|
|
72
|
+
bucketAuto(param) {
|
|
73
|
+
return this._pipe('bucketAuto', param);
|
|
74
|
+
}
|
|
75
|
+
count(param) {
|
|
76
|
+
return this._pipe('count', param);
|
|
77
|
+
}
|
|
78
|
+
geoNear(param) {
|
|
79
|
+
if (param.query) {
|
|
80
|
+
param.query = query_1.QuerySerializer.encode(param.query);
|
|
81
|
+
}
|
|
82
|
+
if (param.distanceMultiplier && typeof (param.distanceMultiplier) === 'number') {
|
|
83
|
+
param.distanceMultiplier = param.distanceMultiplier;
|
|
84
|
+
}
|
|
85
|
+
if (param.near) {
|
|
86
|
+
param.near = new point_1.Point(param.near.longitude, param.near.latitude).toJSON();
|
|
87
|
+
}
|
|
88
|
+
return this._pipe('geoNear', param);
|
|
89
|
+
}
|
|
90
|
+
group(param) {
|
|
91
|
+
return this._pipe('group', param);
|
|
92
|
+
}
|
|
93
|
+
limit(param) {
|
|
94
|
+
return this._pipe('limit', param);
|
|
95
|
+
}
|
|
96
|
+
match(param) {
|
|
97
|
+
return this._pipe('match', query_1.QuerySerializer.encode(param));
|
|
98
|
+
}
|
|
99
|
+
project(param) {
|
|
100
|
+
return this._pipe('project', param);
|
|
101
|
+
}
|
|
102
|
+
lookup(param) {
|
|
103
|
+
return this._pipe('lookup', param);
|
|
104
|
+
}
|
|
105
|
+
replaceRoot(param) {
|
|
106
|
+
return this._pipe('replaceRoot', param);
|
|
107
|
+
}
|
|
108
|
+
sample(param) {
|
|
109
|
+
return this._pipe('sample', param);
|
|
110
|
+
}
|
|
111
|
+
skip(param) {
|
|
112
|
+
return this._pipe('skip', param);
|
|
113
|
+
}
|
|
114
|
+
sort(param) {
|
|
115
|
+
return this._pipe('sort', param);
|
|
116
|
+
}
|
|
117
|
+
sortByCount(param) {
|
|
118
|
+
return this._pipe('sortByCount', param);
|
|
119
|
+
}
|
|
120
|
+
unwind(param) {
|
|
121
|
+
return this._pipe('unwind', param);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.default = Aggregation;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { DocumentReference } from './document';
|
|
2
|
-
import { Query, QueryOption, UpdateOption } from './query';
|
|
3
|
-
import Aggregation from './aggregate';
|
|
4
|
-
export declare class CollectionReference extends Query {
|
|
5
|
-
protected _transactionId: string;
|
|
6
|
-
readonly name: string;
|
|
7
|
-
doc(docID: string | number): DocumentReference;
|
|
8
|
-
add(data: any): Promise<{
|
|
9
|
-
ids?: string[];
|
|
10
|
-
id?: string;
|
|
11
|
-
inserted?: number;
|
|
12
|
-
ok?: number;
|
|
13
|
-
requestId: string;
|
|
14
|
-
}>;
|
|
15
|
-
aggregate(rawPipeline?: object[]): Aggregation;
|
|
16
|
-
options(apiOptions: QueryOption | UpdateOption): CollectionReference;
|
|
17
|
-
}
|
|
1
|
+
import { DocumentReference } from './document';
|
|
2
|
+
import { Query, QueryOption, UpdateOption } from './query';
|
|
3
|
+
import Aggregation from './aggregate';
|
|
4
|
+
export declare class CollectionReference extends Query {
|
|
5
|
+
protected _transactionId: string;
|
|
6
|
+
readonly name: string;
|
|
7
|
+
doc(docID: string | number): DocumentReference;
|
|
8
|
+
add(data: any): Promise<{
|
|
9
|
+
ids?: string[];
|
|
10
|
+
id?: string;
|
|
11
|
+
inserted?: number;
|
|
12
|
+
ok?: number;
|
|
13
|
+
requestId: string;
|
|
14
|
+
}>;
|
|
15
|
+
aggregate(rawPipeline?: object[]): Aggregation;
|
|
16
|
+
options(apiOptions: QueryOption | UpdateOption): CollectionReference;
|
|
17
|
+
}
|
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const document_1 = require("./document");
|
|
4
|
-
const query_1 = require("./query");
|
|
5
|
-
const aggregate_1 = require("./aggregate");
|
|
6
|
-
const datatype_1 = require("./serializer/datatype");
|
|
7
|
-
const utils_1 = require("./utils/utils");
|
|
8
|
-
const validate_1 = require("./validate");
|
|
9
|
-
const type_1 = require("./utils/type");
|
|
10
|
-
class CollectionReference extends query_1.Query {
|
|
11
|
-
constructor(db, coll, apiOptions, transactionId) {
|
|
12
|
-
super(db, coll, '', apiOptions, transactionId);
|
|
13
|
-
if (transactionId) {
|
|
14
|
-
this._transactionId = transactionId;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
get name() {
|
|
18
|
-
return this._coll;
|
|
19
|
-
}
|
|
20
|
-
doc(docID) {
|
|
21
|
-
if (typeof docID !== 'string' && typeof docID !== 'number') {
|
|
22
|
-
throw new Error('docId必须为字符串或数字');
|
|
23
|
-
}
|
|
24
|
-
return new document_1.DocumentReference(this._db, this._coll, this._apiOptions, docID, this._transactionId);
|
|
25
|
-
}
|
|
26
|
-
async add(data) {
|
|
27
|
-
let transformData = data;
|
|
28
|
-
if (!type_1.isArray(data)) {
|
|
29
|
-
transformData = [data];
|
|
30
|
-
}
|
|
31
|
-
transformData = transformData.map(item => {
|
|
32
|
-
return utils_1.stringifyByEJSON(datatype_1.serialize(item));
|
|
33
|
-
});
|
|
34
|
-
let params = {
|
|
35
|
-
collectionName: this._coll,
|
|
36
|
-
data: transformData
|
|
37
|
-
};
|
|
38
|
-
if (this._transactionId) {
|
|
39
|
-
params.transactionId = this._transactionId;
|
|
40
|
-
}
|
|
41
|
-
const res = await this._request.send('database.insertDocument', params, utils_1.getReqOpts(this._apiOptions));
|
|
42
|
-
if (res.code) {
|
|
43
|
-
return res;
|
|
44
|
-
}
|
|
45
|
-
if (!type_1.isArray(data)) {
|
|
46
|
-
if (this._transactionId) {
|
|
47
|
-
return {
|
|
48
|
-
inserted: 1,
|
|
49
|
-
ok: 1,
|
|
50
|
-
id: res.data.insertedIds[0],
|
|
51
|
-
requestId: res.requestId
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
return {
|
|
55
|
-
id: res.data.insertedIds[0],
|
|
56
|
-
requestId: res.requestId
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
ids: res.data.insertedIds,
|
|
61
|
-
requestId: res.requestId
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
aggregate(rawPipeline = []) {
|
|
65
|
-
return new aggregate_1.default(this._db, this._coll, (this._apiOptions.raw || false) ? rawPipeline : []);
|
|
66
|
-
}
|
|
67
|
-
options(apiOptions) {
|
|
68
|
-
validate_1.Validate.isValidOptions(apiOptions);
|
|
69
|
-
return new CollectionReference(this._db, this._coll, apiOptions, this._transactionId);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
exports.CollectionReference = CollectionReference;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const document_1 = require("./document");
|
|
4
|
+
const query_1 = require("./query");
|
|
5
|
+
const aggregate_1 = require("./aggregate");
|
|
6
|
+
const datatype_1 = require("./serializer/datatype");
|
|
7
|
+
const utils_1 = require("./utils/utils");
|
|
8
|
+
const validate_1 = require("./validate");
|
|
9
|
+
const type_1 = require("./utils/type");
|
|
10
|
+
class CollectionReference extends query_1.Query {
|
|
11
|
+
constructor(db, coll, apiOptions, transactionId) {
|
|
12
|
+
super(db, coll, '', apiOptions, transactionId);
|
|
13
|
+
if (transactionId) {
|
|
14
|
+
this._transactionId = transactionId;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
get name() {
|
|
18
|
+
return this._coll;
|
|
19
|
+
}
|
|
20
|
+
doc(docID) {
|
|
21
|
+
if (typeof docID !== 'string' && typeof docID !== 'number') {
|
|
22
|
+
throw new Error('docId必须为字符串或数字');
|
|
23
|
+
}
|
|
24
|
+
return new document_1.DocumentReference(this._db, this._coll, this._apiOptions, docID, this._transactionId);
|
|
25
|
+
}
|
|
26
|
+
async add(data) {
|
|
27
|
+
let transformData = data;
|
|
28
|
+
if (!type_1.isArray(data)) {
|
|
29
|
+
transformData = [data];
|
|
30
|
+
}
|
|
31
|
+
transformData = transformData.map(item => {
|
|
32
|
+
return utils_1.stringifyByEJSON(datatype_1.serialize(item));
|
|
33
|
+
});
|
|
34
|
+
let params = {
|
|
35
|
+
collectionName: this._coll,
|
|
36
|
+
data: transformData
|
|
37
|
+
};
|
|
38
|
+
if (this._transactionId) {
|
|
39
|
+
params.transactionId = this._transactionId;
|
|
40
|
+
}
|
|
41
|
+
const res = await this._request.send('database.insertDocument', params, utils_1.getReqOpts(this._apiOptions));
|
|
42
|
+
if (res.code) {
|
|
43
|
+
return res;
|
|
44
|
+
}
|
|
45
|
+
if (!type_1.isArray(data)) {
|
|
46
|
+
if (this._transactionId) {
|
|
47
|
+
return {
|
|
48
|
+
inserted: 1,
|
|
49
|
+
ok: 1,
|
|
50
|
+
id: res.data.insertedIds[0],
|
|
51
|
+
requestId: res.requestId
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
id: res.data.insertedIds[0],
|
|
56
|
+
requestId: res.requestId
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
ids: res.data.insertedIds,
|
|
61
|
+
requestId: res.requestId
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
aggregate(rawPipeline = []) {
|
|
65
|
+
return new aggregate_1.default(this._db, this._coll, (this._apiOptions.raw || false) ? rawPipeline : []);
|
|
66
|
+
}
|
|
67
|
+
options(apiOptions) {
|
|
68
|
+
validate_1.Validate.isValidOptions(apiOptions);
|
|
69
|
+
return new CollectionReference(this._db, this._coll, apiOptions, this._transactionId);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.CollectionReference = CollectionReference;
|