@travetto/model-mongo 8.0.6 → 8.0.8
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/package.json +2 -2
- package/src/service.ts +34 -15
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@travetto/model-mongo",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.8",
|
|
4
4
|
"description": "Mongo backing for the travetto model module.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"database",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@travetto/config": "^8.0.3",
|
|
33
33
|
"@travetto/model": "^8.0.4",
|
|
34
34
|
"@travetto/model-indexed": "^8.0.4",
|
|
35
|
-
"@travetto/model-query": "^8.0.
|
|
35
|
+
"@travetto/model-query": "^8.0.8",
|
|
36
36
|
"mongodb": "^7.6.0"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
package/src/service.ts
CHANGED
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
type ModelQueryCrudSupport,
|
|
59
59
|
ModelQueryCrudUtil,
|
|
60
60
|
type ModelQueryFacet,
|
|
61
|
+
type FacetModelQuery,
|
|
61
62
|
type ModelQueryFacetSupport,
|
|
62
63
|
type ModelQuerySuggestSupport,
|
|
63
64
|
ModelQuerySuggestUtil,
|
|
@@ -66,6 +67,7 @@ import {
|
|
|
66
67
|
type NumberFieldAggregateResult,
|
|
67
68
|
type PageableModelQuery,
|
|
68
69
|
QueryVerifier,
|
|
70
|
+
type SuggestModelQuery,
|
|
69
71
|
type ValidComparableFields,
|
|
70
72
|
type ValidStringFields,
|
|
71
73
|
type WhereClause
|
|
@@ -713,13 +715,14 @@ export class MongoModelService
|
|
|
713
715
|
}
|
|
714
716
|
|
|
715
717
|
// Facet
|
|
716
|
-
async facetByQuery<T extends ModelType>(
|
|
718
|
+
async facetByQuery<T extends ModelType>(
|
|
719
|
+
cls: Class<T>,
|
|
720
|
+
field: ValidStringFields<T>,
|
|
721
|
+
query?: FacetModelQuery<T>
|
|
722
|
+
): Promise<ModelQueryFacet[]> {
|
|
717
723
|
await QueryVerifier.verify(cls, query);
|
|
718
724
|
|
|
719
725
|
const col = await this.getStore(cls);
|
|
720
|
-
if (query) {
|
|
721
|
-
await QueryVerifier.verify(cls, query);
|
|
722
|
-
}
|
|
723
726
|
|
|
724
727
|
let queryObject: Record<string, unknown> = { [field]: { $exists: true } };
|
|
725
728
|
|
|
@@ -727,8 +730,19 @@ export class MongoModelService
|
|
|
727
730
|
queryObject = { $and: [queryObject, MongoUtil.extractWhereFilter(cls, query.where)] };
|
|
728
731
|
}
|
|
729
732
|
|
|
733
|
+
const unwinds: object[] = [];
|
|
734
|
+
const segments = String(field).split('.');
|
|
735
|
+
for (let index = 1; index <= segments.length; index++) {
|
|
736
|
+
const subPath = segments.slice(0, index);
|
|
737
|
+
const fieldConfiguration = SchemaRegistryIndex.getNestedFieldConfig(cls, subPath);
|
|
738
|
+
if (fieldConfiguration?.array) {
|
|
739
|
+
unwinds.push({ $unwind: `$${subPath.join('.')}` });
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
|
|
730
743
|
const aggregations: object[] = [
|
|
731
744
|
{ $match: queryObject },
|
|
745
|
+
...unwinds,
|
|
732
746
|
{
|
|
733
747
|
$group: {
|
|
734
748
|
_id: `$${field}`,
|
|
@@ -736,17 +750,22 @@ export class MongoModelService
|
|
|
736
750
|
$sum: 1
|
|
737
751
|
}
|
|
738
752
|
}
|
|
739
|
-
}
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
$sort: {
|
|
756
|
+
count: -1
|
|
757
|
+
}
|
|
758
|
+
},
|
|
759
|
+
...(query?.offset !== undefined ? [{ $skip: query.offset }] : []),
|
|
760
|
+
...(query?.limit !== undefined ? [{ $limit: query.limit }] : [])
|
|
740
761
|
];
|
|
741
762
|
|
|
742
763
|
const result = await col.aggregate<{ _id: ObjectId; count: number }>(aggregations).toArray();
|
|
743
764
|
|
|
744
|
-
return result
|
|
745
|
-
.
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
}))
|
|
749
|
-
.toSorted((a, b) => b.count - a.count);
|
|
765
|
+
return result.map(item => ({
|
|
766
|
+
key: MongoUtil.idToString(item._id),
|
|
767
|
+
count: item.count
|
|
768
|
+
}));
|
|
750
769
|
}
|
|
751
770
|
|
|
752
771
|
// Aggregate
|
|
@@ -791,24 +810,24 @@ export class MongoModelService
|
|
|
791
810
|
cls: Class<T>,
|
|
792
811
|
field: ValidStringFields<T>,
|
|
793
812
|
prefix?: string,
|
|
794
|
-
query?:
|
|
813
|
+
query?: SuggestModelQuery<T>
|
|
795
814
|
): Promise<string[]> {
|
|
796
815
|
await QueryVerifier.verify(cls, query);
|
|
797
816
|
const resolvedQuery = ModelQuerySuggestUtil.getSuggestFieldQuery<T>(cls, field, prefix, query);
|
|
798
817
|
const results = await this.query<T>(cls, resolvedQuery);
|
|
799
|
-
return ModelQuerySuggestUtil.combineSuggestResults<T, string>(cls, field, prefix, results, a => a, query
|
|
818
|
+
return ModelQuerySuggestUtil.combineSuggestResults<T, string>(cls, field, prefix, results, a => a, query);
|
|
800
819
|
}
|
|
801
820
|
|
|
802
821
|
async suggestByQuery<T extends ModelType>(
|
|
803
822
|
cls: Class<T>,
|
|
804
823
|
field: ValidStringFields<T>,
|
|
805
824
|
prefix?: string,
|
|
806
|
-
query?:
|
|
825
|
+
query?: SuggestModelQuery<T>
|
|
807
826
|
): Promise<T[]> {
|
|
808
827
|
await QueryVerifier.verify(cls, query);
|
|
809
828
|
const resolvedQuery = ModelQuerySuggestUtil.getSuggestQuery<T>(cls, field, prefix, query);
|
|
810
829
|
const results = await this.query<T>(cls, resolvedQuery);
|
|
811
|
-
return ModelQuerySuggestUtil.combineSuggestResults(cls, field, prefix, results, (_, b) => b, query
|
|
830
|
+
return ModelQuerySuggestUtil.combineSuggestResults(cls, field, prefix, results, (_, b) => b, query);
|
|
812
831
|
}
|
|
813
832
|
|
|
814
833
|
// Other
|