@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.
Files changed (2) hide show
  1. package/package.json +2 -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.6",
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.6",
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>(cls: Class<T>, field: ValidStringFields<T>, query?: ModelQuery<T>): Promise<ModelQueryFacet[]> {
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
- .map(item => ({
746
- key: MongoUtil.idToString(item._id),
747
- count: item.count
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?: PageableModelQuery<T>
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?.limit);
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?: PageableModelQuery<T>
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?.limit);
830
+ return ModelQuerySuggestUtil.combineSuggestResults(cls, field, prefix, results, (_, b) => b, query);
812
831
  }
813
832
 
814
833
  // Other