@thisisagile/easy-mongo 12.7.13 → 12.7.18
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/dist/MongoGateway.d.ts +1 -1
- package/dist/MongoProvider.d.ts +13 -13
- package/dist/MongoProvider.js +28 -28
- package/dist/MongoProvider.js.map +1 -1
- package/package.json +3 -3
- package/src/MongoGateway.ts +1 -1
- package/src/MongoProvider.ts +184 -183
package/dist/MongoGateway.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FindOptions, MongoProvider } from './MongoProvider';
|
|
2
2
|
import { Condition, Gateway, Id, Json, JsonValue, List, LogicalCondition, PageList } from '@thisisagile/easy';
|
|
3
3
|
import { Collection } from './Collection';
|
|
4
|
-
export declare class MongoGateway implements Gateway {
|
|
4
|
+
export declare class MongoGateway implements Gateway<FindOptions> {
|
|
5
5
|
readonly collection: Collection;
|
|
6
6
|
readonly provider: MongoProvider;
|
|
7
7
|
constructor(collection: Collection, provider?: MongoProvider);
|
package/dist/MongoProvider.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Condition, Database, Field, Id, Json, JsonValue, LogicalCondition, OneOrMore, PageList,
|
|
1
|
+
import { Condition, Database, FetchOptions, Field, Id, Json, JsonValue, LogicalCondition, OneOrMore, PageList, Sort } from '@thisisagile/easy';
|
|
2
2
|
import { AggregationCursor, Collection as MongoCollection, CreateIndexesOptions, Document, Filter as MongoFilter, FindCursor, FindOptions as MongoFindOptions, IndexSpecification, MongoClient } from 'mongodb';
|
|
3
3
|
import { Collection } from './Collection';
|
|
4
4
|
export declare type Projection = Record<string, 0 | 1>;
|
|
5
|
-
export declare type FindOptions =
|
|
5
|
+
export declare type FindOptions = FetchOptions & {
|
|
6
6
|
projection?: Projection;
|
|
7
7
|
};
|
|
8
8
|
export declare type Filter<T> = MongoFilter<T>;
|
|
@@ -17,24 +17,14 @@ export declare type Indexes = OneOrMore<string | Field | Sort | Record<string, 1
|
|
|
17
17
|
export declare class MongoProvider {
|
|
18
18
|
readonly coll: Collection;
|
|
19
19
|
protected client?: Promise<MongoClient> | undefined;
|
|
20
|
-
aggregate: (qs: Filter<any>[]) => Promise<PageList<Json>>;
|
|
21
20
|
protected static readonly clients: {
|
|
22
21
|
[key: string]: Promise<MongoClient>;
|
|
23
22
|
};
|
|
23
|
+
aggregate: (qs: Filter<any>[]) => Promise<PageList<Json>>;
|
|
24
24
|
constructor(coll: Collection, client?: Promise<MongoClient> | undefined);
|
|
25
25
|
static client(db: Database): Promise<MongoClient>;
|
|
26
26
|
cluster(): Promise<MongoClient>;
|
|
27
27
|
toMongoJson(query: Query): Json;
|
|
28
|
-
protected toFindOptions(options?: FindOptions): MongoFindOptions & {
|
|
29
|
-
total: boolean;
|
|
30
|
-
};
|
|
31
|
-
protected toIndexSpecification(index: Indexes): IndexSpecification;
|
|
32
|
-
protected toCreateIndexesOptions(options?: IndexOptions): CreateIndexesOptions;
|
|
33
|
-
protected toArray(cursor: FindCursor<Document> | AggregationCursor<Document>, options?: {
|
|
34
|
-
take?: number;
|
|
35
|
-
skip?: number;
|
|
36
|
-
total?: number;
|
|
37
|
-
}): Promise<PageList<Json>>;
|
|
38
28
|
find(query: Query, options?: FindOptions): Promise<PageList<Json>>;
|
|
39
29
|
all(options?: FindOptions): Promise<PageList<Json>>;
|
|
40
30
|
byId(id: Id, options?: FindOptions): Promise<Json>;
|
|
@@ -48,4 +38,14 @@ export declare class MongoProvider {
|
|
|
48
38
|
createPartialIndex(indexes: Indexes, filter: Query, options?: Omit<IndexOptions, 'filter'>): Promise<string>;
|
|
49
39
|
createTextIndex(indexes: OneOrMore<Field | string>, options?: IndexOptions): Promise<string>;
|
|
50
40
|
collection(): Promise<MongoCollection>;
|
|
41
|
+
protected toFindOptions(options?: FindOptions): MongoFindOptions & {
|
|
42
|
+
total: boolean;
|
|
43
|
+
};
|
|
44
|
+
protected toIndexSpecification(index: Indexes): IndexSpecification;
|
|
45
|
+
protected toCreateIndexesOptions(options?: IndexOptions): CreateIndexesOptions;
|
|
46
|
+
protected toArray(cursor: FindCursor<Document> | AggregationCursor<Document>, options?: {
|
|
47
|
+
take?: number;
|
|
48
|
+
skip?: number;
|
|
49
|
+
total?: number;
|
|
50
|
+
}): Promise<PageList<Json>>;
|
|
51
51
|
}
|
package/dist/MongoProvider.js
CHANGED
|
@@ -36,34 +36,6 @@ class MongoProvider {
|
|
|
36
36
|
toMongoJson(query) {
|
|
37
37
|
return (0, Utils_1.toMongoType)((0, easy_1.asJson)(query));
|
|
38
38
|
}
|
|
39
|
-
toFindOptions(options) {
|
|
40
|
-
return {
|
|
41
|
-
limit: options?.take ?? 250,
|
|
42
|
-
...(options?.skip && { skip: options?.skip }),
|
|
43
|
-
...(options?.sort && { sort: this.coll.sort(...options?.sort) }),
|
|
44
|
-
total: (0, easy_1.isDefined)(options?.skip) || (0, easy_1.isDefined)(options?.take),
|
|
45
|
-
projection: options?.projection ?? { _id: 0 },
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
toIndexSpecification(index) {
|
|
49
|
-
return (0, easy_1.choose)(index)
|
|
50
|
-
.type(easy_1.isField, f => f.property)
|
|
51
|
-
.type(easy_1.isSortCondition, s => s.toJSON())
|
|
52
|
-
.type(easy_1.isArray, aa => aa.map(a => this.toIndexSpecification(a)))
|
|
53
|
-
.else(i => i);
|
|
54
|
-
}
|
|
55
|
-
toCreateIndexesOptions(options) {
|
|
56
|
-
return {
|
|
57
|
-
unique: options?.unique ?? true,
|
|
58
|
-
...(options?.languageOverride && { language_override: options.languageOverride }),
|
|
59
|
-
...(options?.languageDefault && { default_language: options.languageDefault }),
|
|
60
|
-
...(options?.filter && { partialFilterExpression: (0, Utils_1.toMongoType)((0, easy_1.asJson)(options.filter)) }),
|
|
61
|
-
writeConcern: { w: 1 },
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
toArray(cursor, options) {
|
|
65
|
-
return cursor.toArray().then(r => (0, easy_1.toPageList)(r, options));
|
|
66
|
-
}
|
|
67
39
|
find(query, options) {
|
|
68
40
|
return (0, easy_1.tuple3)(this.collection(), this.toMongoJson(query), this.toFindOptions(options))
|
|
69
41
|
.then(([c, q, o]) => (0, easy_1.tuple2)(c.find(q, o), (0, easy_1.ifTrue)(o.total, () => c.countDocuments(q))))
|
|
@@ -116,6 +88,34 @@ class MongoProvider {
|
|
|
116
88
|
.then(c => c.db(this.coll.db.name))
|
|
117
89
|
.then(db => db.collection((0, easy_1.asString)(this.coll)));
|
|
118
90
|
}
|
|
91
|
+
toFindOptions(options) {
|
|
92
|
+
return {
|
|
93
|
+
limit: options?.take ?? 250,
|
|
94
|
+
...(options?.skip && { skip: options?.skip }),
|
|
95
|
+
...(options?.sort && { sort: this.coll.sort(...(options?.sort ?? {})) }),
|
|
96
|
+
total: (0, easy_1.isDefined)(options?.skip) || (0, easy_1.isDefined)(options?.take),
|
|
97
|
+
projection: options?.projection ?? { _id: 0 },
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
toIndexSpecification(index) {
|
|
101
|
+
return (0, easy_1.choose)(index)
|
|
102
|
+
.type(easy_1.isField, f => f.property)
|
|
103
|
+
.type(easy_1.isSortCondition, s => s.toJSON())
|
|
104
|
+
.type(easy_1.isArray, aa => aa.map(a => this.toIndexSpecification(a)))
|
|
105
|
+
.else(i => i);
|
|
106
|
+
}
|
|
107
|
+
toCreateIndexesOptions(options) {
|
|
108
|
+
return {
|
|
109
|
+
unique: options?.unique ?? true,
|
|
110
|
+
...(options?.languageOverride && { language_override: options.languageOverride }),
|
|
111
|
+
...(options?.languageDefault && { default_language: options.languageDefault }),
|
|
112
|
+
...(options?.filter && { partialFilterExpression: (0, Utils_1.toMongoType)((0, easy_1.asJson)(options.filter)) }),
|
|
113
|
+
writeConcern: { w: 1 },
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
toArray(cursor, options) {
|
|
117
|
+
return cursor.toArray().then(r => (0, easy_1.toPageList)(r, options));
|
|
118
|
+
}
|
|
119
119
|
}
|
|
120
120
|
exports.MongoProvider = MongoProvider;
|
|
121
121
|
MongoProvider.clients = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoProvider.js","sourceRoot":"","sources":["../src/MongoProvider.ts"],"names":[],"mappings":";;;AAAA,4CA4B2B;AAC3B,qCAUiB;AAEjB,
|
|
1
|
+
{"version":3,"file":"MongoProvider.js","sourceRoot":"","sources":["../src/MongoProvider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thisisagile/easy-mongo",
|
|
3
|
-
"version": "12.7.
|
|
3
|
+
"version": "12.7.18",
|
|
4
4
|
"description": "Add support for MongoDB",
|
|
5
5
|
"author": "Sander Hoogendoorn",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"access": "public"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@thisisagile/easy-test": "12.7.
|
|
34
|
+
"@thisisagile/easy-test": "12.7.18"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@thisisagile/easy": "^12.7.
|
|
37
|
+
"@thisisagile/easy": "^12.7.18",
|
|
38
38
|
"mongodb": "^4.11.0"
|
|
39
39
|
}
|
|
40
40
|
}
|
package/src/MongoGateway.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { FindOptions, MongoProvider } from './MongoProvider';
|
|
|
2
2
|
import { asJson, asPageList, Condition, Gateway, Id, ifDefined, isDefined, Json, JsonValue, List, LogicalCondition, PageList } from '@thisisagile/easy';
|
|
3
3
|
import { Collection } from './Collection';
|
|
4
4
|
|
|
5
|
-
export class MongoGateway implements Gateway {
|
|
5
|
+
export class MongoGateway implements Gateway<FindOptions> {
|
|
6
6
|
constructor(readonly collection: Collection, readonly provider: MongoProvider = collection.provider) {}
|
|
7
7
|
|
|
8
8
|
all(options?: FindOptions): Promise<PageList<Json>> {
|
package/src/MongoProvider.ts
CHANGED
|
@@ -1,201 +1,202 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
2
|
+
asJson,
|
|
3
|
+
asString,
|
|
4
|
+
choose,
|
|
5
|
+
Condition,
|
|
6
|
+
Database,
|
|
7
|
+
Exception,
|
|
8
|
+
FetchOptions,
|
|
9
|
+
Field,
|
|
10
|
+
Id,
|
|
11
|
+
ifTrue,
|
|
12
|
+
isArray,
|
|
13
|
+
isDefined,
|
|
14
|
+
isField,
|
|
15
|
+
isSortCondition,
|
|
16
|
+
json,
|
|
17
|
+
Json,
|
|
18
|
+
JsonValue,
|
|
19
|
+
LogicalCondition,
|
|
20
|
+
OneOrMore,
|
|
21
|
+
PageList,
|
|
22
|
+
reject,
|
|
23
|
+
Sort,
|
|
24
|
+
toArray,
|
|
25
|
+
toPageList,
|
|
26
|
+
tuple2,
|
|
27
|
+
tuple3,
|
|
28
|
+
when,
|
|
29
29
|
} from '@thisisagile/easy';
|
|
30
30
|
import {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
31
|
+
AggregationCursor,
|
|
32
|
+
Collection as MongoCollection,
|
|
33
|
+
CreateIndexesOptions,
|
|
34
|
+
Document,
|
|
35
|
+
Filter as MongoFilter,
|
|
36
|
+
FindCursor,
|
|
37
|
+
FindOptions as MongoFindOptions,
|
|
38
|
+
IndexSpecification,
|
|
39
|
+
MongoClient,
|
|
40
40
|
} from 'mongodb';
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
41
|
+
import {Collection} from './Collection';
|
|
42
|
+
import {toMongoType} from './Utils';
|
|
43
43
|
|
|
44
44
|
const omitId = (j: Json): Json => json.delete(j, '_id');
|
|
45
45
|
|
|
46
46
|
export type Projection = Record<string, 0 | 1>;
|
|
47
|
-
export type FindOptions =
|
|
47
|
+
export type FindOptions = FetchOptions & { projection?: Projection };
|
|
48
48
|
export type Filter<T> = MongoFilter<T>;
|
|
49
49
|
export type Query = Condition | LogicalCondition | Filter<any>;
|
|
50
50
|
|
|
51
51
|
export type IndexOptions = {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
unique?: boolean;
|
|
53
|
+
filter?: Query;
|
|
54
|
+
languageOverride?: string;
|
|
55
|
+
languageDefault?: string;
|
|
56
56
|
};
|
|
57
57
|
|
|
58
58
|
export type Indexes = OneOrMore<string | Field | Sort | Record<string, 1 | -1>>;
|
|
59
59
|
|
|
60
60
|
export class MongoProvider {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
61
|
+
protected static readonly clients: { [key: string]: Promise<MongoClient> } = {};
|
|
62
|
+
aggregate = this.group;
|
|
63
|
+
|
|
64
|
+
constructor(readonly coll: Collection, protected client?: Promise<MongoClient>) {
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static client(db: Database): Promise<MongoClient> {
|
|
68
|
+
return when(db.options?.cluster)
|
|
69
|
+
.not.isDefined.reject(Exception.IsNotValid.because('Missing cluster in database options.'))
|
|
70
|
+
.then(
|
|
71
|
+
u =>
|
|
72
|
+
(MongoProvider.clients[u] = MongoProvider.clients[u] ??
|
|
73
|
+
MongoClient.connect(u, {
|
|
74
|
+
auth: {
|
|
75
|
+
username: asString(db.options?.user),
|
|
76
|
+
password: asString(db.options?.password),
|
|
77
|
+
},
|
|
78
|
+
...(db.options?.maxPoolSize && {maxPoolSize: db.options?.maxPoolSize}),
|
|
79
|
+
...(db.options?.minPoolSize && {minPoolSize: db.options?.minPoolSize}),
|
|
80
|
+
...(db.options?.maxIdleTimeMS && {maxIdleTimeMS: db.options?.maxIdleTimeMS}),
|
|
81
|
+
}))
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
cluster(): Promise<MongoClient> {
|
|
86
|
+
return Promise.resolve()
|
|
87
|
+
.then(() => this.client ?? (this.client = MongoProvider.client(this.coll.db)))
|
|
88
|
+
.catch(e => {
|
|
89
|
+
this.client = undefined;
|
|
90
|
+
return reject(e);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
toMongoJson(query: Query): Json {
|
|
95
|
+
return toMongoType(asJson(query));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
find(query: Query, options?: FindOptions): Promise<PageList<Json>> {
|
|
99
|
+
return tuple3(this.collection(), this.toMongoJson(query), this.toFindOptions(options))
|
|
100
|
+
.then(([c, q, o]) =>
|
|
101
|
+
tuple2(
|
|
102
|
+
c.find(q, o),
|
|
103
|
+
ifTrue(o.total, () => c.countDocuments(q))
|
|
104
|
+
)
|
|
105
|
+
)
|
|
106
|
+
.then(([res, total]) => this.toArray(res, options && {total}));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
all(options?: FindOptions): Promise<PageList<Json>> {
|
|
110
|
+
return this.find({}, options);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
byId(id: Id, options?: FindOptions): Promise<Json> {
|
|
114
|
+
return this.collection().then(c => c.findOne(this.toMongoJson({id: asString(id)}), this.toFindOptions(options)) as Promise<Json>);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
by(key: string, value: JsonValue, options?: FindOptions): Promise<PageList<Json>> {
|
|
118
|
+
return this.find({[key]: asString(value)}, options);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
group(qs: Filter<any>[]): Promise<PageList<Json>> {
|
|
122
|
+
return this.collection()
|
|
123
|
+
.then(c => c.aggregate(qs.map(q => this.toMongoJson(q))))
|
|
124
|
+
.then(res => this.toArray(res));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
add(item: Json): Promise<Json> {
|
|
128
|
+
return this.collection()
|
|
129
|
+
.then(c => c.insertOne(omitId(item)))
|
|
130
|
+
.then(() => omitId(item));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
update(item: Json): Promise<Json> {
|
|
134
|
+
return this.collection()
|
|
135
|
+
.then(c => c.updateOne(this.toMongoJson({id: item.id}), {$set: omitId(item)}))
|
|
136
|
+
.then(() => this.byId(item.id as Id));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
remove(id: Id): Promise<boolean> {
|
|
140
|
+
return this.collection()
|
|
141
|
+
.then(c => c.deleteOne(this.toMongoJson({id})))
|
|
142
|
+
.then(d => d.acknowledged);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
count(query?: Query): Promise<number> {
|
|
146
|
+
return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {})));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
createIndex(indexes: Indexes, options?: IndexOptions): Promise<string> {
|
|
150
|
+
return this.collection().then(c => c.createIndex(this.toIndexSpecification(indexes), this.toCreateIndexesOptions(options)));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
createPartialIndex(indexes: Indexes, filter: Query, options?: Omit<IndexOptions, 'filter'>): Promise<string> {
|
|
154
|
+
return this.createIndex(indexes, {...options, filter});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
createTextIndex(indexes: OneOrMore<Field | string>, options?: IndexOptions): Promise<string> {
|
|
158
|
+
const ii = toArray(indexes).reduce((i, f) => ({...i, [asString(f)]: 'text'}), {});
|
|
159
|
+
return this.createIndex(ii, {unique: false, ...options});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
collection(): Promise<MongoCollection> {
|
|
163
|
+
return this.cluster()
|
|
164
|
+
.then(c => c.db(this.coll.db.name))
|
|
165
|
+
.then(db => db.collection(asString(this.coll)));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
protected toFindOptions(options?: FindOptions): MongoFindOptions & { total: boolean } {
|
|
169
|
+
return {
|
|
170
|
+
limit: options?.take ?? 250,
|
|
171
|
+
...(options?.skip && {skip: options?.skip}),
|
|
172
|
+
...(options?.sort && {sort: this.coll.sort(...(options?.sort ?? {})) as any}),
|
|
173
|
+
total: isDefined(options?.skip) || isDefined(options?.take),
|
|
174
|
+
projection: options?.projection ?? {_id: 0},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
protected toIndexSpecification(index: Indexes): IndexSpecification {
|
|
179
|
+
return choose(index)
|
|
180
|
+
.type(isField, f => f.property as IndexSpecification)
|
|
181
|
+
.type(isSortCondition, s => s.toJSON() as IndexSpecification)
|
|
182
|
+
.type(isArray, aa => aa.map(a => this.toIndexSpecification(a)) as IndexSpecification)
|
|
183
|
+
.else(i => i as IndexSpecification);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
protected toCreateIndexesOptions(options?: IndexOptions): CreateIndexesOptions {
|
|
187
|
+
return {
|
|
188
|
+
unique: options?.unique ?? true,
|
|
189
|
+
...(options?.languageOverride && {language_override: options.languageOverride}),
|
|
190
|
+
...(options?.languageDefault && {default_language: options.languageDefault}),
|
|
191
|
+
...(options?.filter && {partialFilterExpression: toMongoType(asJson(options.filter))}),
|
|
192
|
+
writeConcern: {w: 1},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
protected toArray(
|
|
197
|
+
cursor: FindCursor<Document> | AggregationCursor<Document>,
|
|
198
|
+
options?: { take?: number; skip?: number; total?: number }
|
|
199
|
+
): Promise<PageList<Json>> {
|
|
200
|
+
return cursor.toArray().then(r => toPageList<Json>(r, options));
|
|
201
|
+
}
|
|
201
202
|
}
|