@payloadcms/db-mongodb 3.59.0-internal.ff6711a → 3.59.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.
@@ -1 +1 @@
1
- {"version":3,"file":"findDistinct.d.ts","sourceRoot":"","sources":["../src/findDistinct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAA;AAW3D,eAAO,MAAM,YAAY,EAAE,YAwO1B,CAAA"}
1
+ {"version":3,"file":"findDistinct.d.ts","sourceRoot":"","sources":["../src/findDistinct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,SAAS,CAAA;AAW3D,eAAO,MAAM,YAAY,EAAE,YAoP1B,CAAA"}
@@ -1,4 +1,4 @@
1
- import { APIError, getFieldByPath } from 'payload';
1
+ import { getFieldByPath } from 'payload';
2
2
  import { buildQuery } from './queries/buildQuery.js';
3
3
  import { buildSortParam } from './queries/buildSortParam.js';
4
4
  import { getCollection } from './utilities/getEntity.js';
@@ -10,7 +10,7 @@ export const findDistinct = async function(args) {
10
10
  });
11
11
  const session = await getSession(this, args.req);
12
12
  const { where = {} } = args;
13
- const sortAggregation = [];
13
+ let sortAggregation = [];
14
14
  const sort = buildSortParam({
15
15
  adapter: this,
16
16
  config: this.payload.config,
@@ -28,7 +28,9 @@ export const findDistinct = async function(args) {
28
28
  where
29
29
  });
30
30
  const fieldPathResult = getFieldByPath({
31
+ config: this.payload.config,
31
32
  fields: collectionConfig.flattenedFields,
33
+ includeRelationships: true,
32
34
  path: args.field
33
35
  });
34
36
  let fieldPath = args.field;
@@ -40,59 +42,75 @@ export const findDistinct = async function(args) {
40
42
  ;
41
43
  const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1;
42
44
  let currentFields = collectionConfig.flattenedFields;
43
- let relationTo = null;
44
45
  let foundField = null;
45
- let foundFieldPath = '';
46
- let relationFieldPath = '';
46
+ let rels = [];
47
+ let tempPath = '';
48
+ let insideRelation = false;
47
49
  for (const segment of args.field.split('.')){
48
50
  const field = currentFields.find((e)=>e.name === segment);
51
+ if (rels.length) {
52
+ insideRelation = true;
53
+ }
49
54
  if (!field) {
50
55
  break;
51
56
  }
52
- if (relationTo) {
53
- foundFieldPath = `${foundFieldPath}${field?.name}`;
57
+ if (tempPath) {
58
+ tempPath = `${tempPath}.${field.name}`;
54
59
  } else {
55
- relationFieldPath = `${relationFieldPath}${field.name}`;
60
+ tempPath = field.name;
56
61
  }
57
62
  if ('flattenedFields' in field) {
58
63
  currentFields = field.flattenedFields;
59
- if (relationTo) {
60
- foundFieldPath = `${foundFieldPath}.`;
61
- } else {
62
- relationFieldPath = `${relationFieldPath}.`;
63
- }
64
64
  continue;
65
65
  }
66
66
  if ((field.type === 'relationship' || field.type === 'upload') && typeof field.relationTo === 'string') {
67
- if (relationTo) {
68
- throw new APIError(`findDistinct for fields nested to relationships supported 1 level only, errored field: ${args.field}`);
69
- }
70
- relationTo = field.relationTo;
67
+ rels.push({
68
+ fieldPath: tempPath,
69
+ relationTo: field.relationTo
70
+ });
71
71
  currentFields = this.payload.collections[field.relationTo]?.config.flattenedFields;
72
72
  continue;
73
73
  }
74
74
  foundField = field;
75
- if (sortAggregation.some((stage)=>'$lookup' in stage && stage.$lookup.localField === relationFieldPath)) {
76
- sortProperty = sortProperty.replace('__', '');
77
- sortAggregation.pop();
78
- }
79
75
  }
80
76
  const resolvedField = foundField || fieldPathResult?.field;
81
77
  const isHasManyValue = resolvedField && 'hasMany' in resolvedField && resolvedField;
82
78
  let relationLookup = null;
83
- if (relationTo && foundFieldPath && relationFieldPath) {
84
- const { Model: foreignModel } = getCollection({
85
- adapter: this,
86
- collectionSlug: relationTo
87
- });
88
- relationLookup = {
89
- $lookup: {
90
- as: relationFieldPath,
91
- foreignField: '_id',
92
- from: foreignModel.collection.name,
93
- localField: relationFieldPath
79
+ if (!insideRelation) {
80
+ rels = [];
81
+ }
82
+ if (rels.length) {
83
+ if (sortProperty.startsWith('_')) {
84
+ const sortWithoutRelationPrefix = sortProperty.replace(/^_+/, '');
85
+ const lastFieldPath = rels.at(-1)?.fieldPath;
86
+ if (sortWithoutRelationPrefix.startsWith(lastFieldPath)) {
87
+ sortProperty = sortWithoutRelationPrefix;
94
88
  }
95
- };
89
+ }
90
+ relationLookup = rels.reduce((acc, { fieldPath, relationTo })=>{
91
+ sortAggregation = sortAggregation.filter((each)=>{
92
+ if ('$lookup' in each && each.$lookup.as.replace(/^_+/, '') === fieldPath) {
93
+ return false;
94
+ }
95
+ return true;
96
+ });
97
+ const { Model: foreignModel } = getCollection({
98
+ adapter: this,
99
+ collectionSlug: relationTo
100
+ });
101
+ acc.push({
102
+ $lookup: {
103
+ as: fieldPath,
104
+ foreignField: '_id',
105
+ from: foreignModel.collection.name,
106
+ localField: fieldPath
107
+ }
108
+ });
109
+ acc.push({
110
+ $unwind: `$${fieldPath}`
111
+ });
112
+ return acc;
113
+ }, []);
96
114
  }
97
115
  let $unwind = '';
98
116
  let $group = null;
@@ -128,12 +146,7 @@ export const findDistinct = async function(args) {
128
146
  $match: query
129
147
  },
130
148
  ...sortAggregation.length > 0 ? sortAggregation : [],
131
- ...relationLookup ? [
132
- relationLookup,
133
- {
134
- $unwind: `$${relationFieldPath}`
135
- }
136
- ] : [],
149
+ ...relationLookup?.length ? relationLookup : [],
137
150
  ...$unwind ? [
138
151
  {
139
152
  $unwind
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/findDistinct.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type { FindDistinct, FlattenedField } from 'payload'\n\nimport { APIError, getFieldByPath } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\n\nexport const findDistinct: FindDistinct = async function (this: MongooseAdapter, args) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug: args.collection,\n })\n\n const session = await getSession(this, args.req)\n\n const { where = {} } = args\n\n const sortAggregation: PipelineStage[] = []\n\n const sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n sort: args.sort ?? args.field,\n sortAggregation,\n timestamps: true,\n })\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug: args.collection,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n where,\n })\n\n const fieldPathResult = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: args.field,\n })\n let fieldPath = args.field\n if (fieldPathResult?.pathHasLocalized && args.locale) {\n fieldPath = fieldPathResult.localizedPath.replace('<locale>', args.locale)\n }\n\n const page = args.page || 1\n\n let sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n let currentFields = collectionConfig.flattenedFields\n let relationTo: null | string = null\n let foundField: FlattenedField | null = null\n let foundFieldPath = ''\n let relationFieldPath = ''\n\n for (const segment of args.field.split('.')) {\n const field = currentFields.find((e) => e.name === segment)\n\n if (!field) {\n break\n }\n\n if (relationTo) {\n foundFieldPath = `${foundFieldPath}${field?.name}`\n } else {\n relationFieldPath = `${relationFieldPath}${field.name}`\n }\n\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n\n if (relationTo) {\n foundFieldPath = `${foundFieldPath}.`\n } else {\n relationFieldPath = `${relationFieldPath}.`\n }\n continue\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n typeof field.relationTo === 'string'\n ) {\n if (relationTo) {\n throw new APIError(\n `findDistinct for fields nested to relationships supported 1 level only, errored field: ${args.field}`,\n )\n }\n relationTo = field.relationTo\n currentFields = this.payload.collections[field.relationTo]?.config\n .flattenedFields as FlattenedField[]\n continue\n }\n foundField = field\n\n if (\n sortAggregation.some(\n (stage) => '$lookup' in stage && stage.$lookup.localField === relationFieldPath,\n )\n ) {\n sortProperty = sortProperty.replace('__', '')\n sortAggregation.pop()\n }\n }\n\n const resolvedField = foundField || fieldPathResult?.field\n const isHasManyValue = resolvedField && 'hasMany' in resolvedField && resolvedField\n\n let relationLookup: null | PipelineStage = null\n if (relationTo && foundFieldPath && relationFieldPath) {\n const { Model: foreignModel } = getCollection({ adapter: this, collectionSlug: relationTo })\n\n relationLookup = {\n $lookup: {\n as: relationFieldPath,\n foreignField: '_id',\n from: foreignModel.collection.name,\n localField: relationFieldPath,\n },\n }\n }\n\n let $unwind: any = ''\n let $group: any = null\n if (\n isHasManyValue &&\n sortAggregation.length &&\n sortAggregation[0] &&\n '$lookup' in sortAggregation[0]\n ) {\n $unwind = { path: `$${sortAggregation[0].$lookup.as}`, preserveNullAndEmptyArrays: true }\n $group = {\n _id: {\n _field: `$${sortAggregation[0].$lookup.as}._id`,\n _sort: `$${sortProperty}`,\n },\n }\n } else if (isHasManyValue) {\n $unwind = { path: `$${args.field}`, preserveNullAndEmptyArrays: true }\n }\n\n if (!$group) {\n $group = {\n _id: {\n _field: `$${fieldPath}`,\n ...(sortProperty === fieldPath\n ? {}\n : {\n _sort: `$${sortProperty}`,\n }),\n },\n }\n }\n\n const pipeline: PipelineStage[] = [\n {\n $match: query,\n },\n ...(sortAggregation.length > 0 ? sortAggregation : []),\n ...(relationLookup ? [relationLookup, { $unwind: `$${relationFieldPath}` }] : []),\n ...($unwind\n ? [\n {\n $unwind,\n },\n ]\n : []),\n {\n $group,\n },\n {\n $sort: {\n [sortProperty === fieldPath ? '_id._field' : '_id._sort']: sortDirection,\n },\n },\n ]\n\n const getValues = async () => {\n return Model.aggregate(pipeline, { session }).then((res) =>\n res.map((each) => ({\n [args.field]: JSON.parse(JSON.stringify(each._id._field)),\n })),\n )\n }\n\n if (args.limit) {\n pipeline.push({\n $skip: (page - 1) * args.limit,\n })\n pipeline.push({ $limit: args.limit })\n const totalDocs = await Model.aggregate(\n [\n {\n $match: query,\n },\n {\n $group: {\n _id: `$${fieldPath}`,\n },\n },\n { $count: 'count' },\n ],\n {\n session,\n },\n ).then((res) => res[0]?.count ?? 0)\n const totalPages = Math.ceil(totalDocs / args.limit)\n const hasPrevPage = page > 1\n const hasNextPage = totalPages > page\n const pagingCounter = (page - 1) * args.limit + 1\n\n return {\n hasNextPage,\n hasPrevPage,\n limit: args.limit,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n values: await getValues(),\n }\n }\n\n const values = await getValues()\n\n return {\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n page: 1,\n pagingCounter: 1,\n totalDocs: values.length,\n totalPages: 1,\n values,\n }\n}\n"],"names":["APIError","getFieldByPath","buildQuery","buildSortParam","getCollection","getSession","findDistinct","args","collectionConfig","Model","adapter","collectionSlug","collection","session","req","where","sortAggregation","sort","config","payload","fields","flattenedFields","locale","field","timestamps","query","fieldPathResult","path","fieldPath","pathHasLocalized","localizedPath","replace","page","sortProperty","Object","keys","sortDirection","currentFields","relationTo","foundField","foundFieldPath","relationFieldPath","segment","split","find","e","name","type","collections","some","stage","$lookup","localField","pop","resolvedField","isHasManyValue","relationLookup","foreignModel","as","foreignField","from","$unwind","$group","length","preserveNullAndEmptyArrays","_id","_field","_sort","pipeline","$match","$sort","getValues","aggregate","then","res","map","each","JSON","parse","stringify","limit","push","$skip","$limit","totalDocs","$count","count","totalPages","Math","ceil","hasPrevPage","hasNextPage","pagingCounter","nextPage","prevPage","values"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/findDistinct.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type { FindDistinct, FlattenedField } from 'payload'\n\nimport { getFieldByPath } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\n\nexport const findDistinct: FindDistinct = async function (this: MongooseAdapter, args) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug: args.collection,\n })\n\n const session = await getSession(this, args.req)\n\n const { where = {} } = args\n\n let sortAggregation: PipelineStage[] = []\n\n const sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n sort: args.sort ?? args.field,\n sortAggregation,\n timestamps: true,\n })\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug: args.collection,\n fields: collectionConfig.flattenedFields,\n locale: args.locale,\n where,\n })\n\n const fieldPathResult = getFieldByPath({\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n includeRelationships: true,\n path: args.field,\n })\n let fieldPath = args.field\n if (fieldPathResult?.pathHasLocalized && args.locale) {\n fieldPath = fieldPathResult.localizedPath.replace('<locale>', args.locale)\n }\n\n const page = args.page || 1\n\n let sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n let currentFields = collectionConfig.flattenedFields\n let foundField: FlattenedField | null = null\n\n let rels: {\n fieldPath: string\n relationTo: string\n }[] = []\n\n let tempPath = ''\n let insideRelation = false\n\n for (const segment of args.field.split('.')) {\n const field = currentFields.find((e) => e.name === segment)\n if (rels.length) {\n insideRelation = true\n }\n\n if (!field) {\n break\n }\n\n if (tempPath) {\n tempPath = `${tempPath}.${field.name}`\n } else {\n tempPath = field.name\n }\n\n if ('flattenedFields' in field) {\n currentFields = field.flattenedFields\n continue\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n typeof field.relationTo === 'string'\n ) {\n rels.push({ fieldPath: tempPath, relationTo: field.relationTo })\n currentFields = this.payload.collections[field.relationTo]?.config\n .flattenedFields as FlattenedField[]\n continue\n }\n foundField = field\n }\n\n const resolvedField = foundField || fieldPathResult?.field\n const isHasManyValue = resolvedField && 'hasMany' in resolvedField && resolvedField\n\n let relationLookup: null | PipelineStage[] = null\n\n if (!insideRelation) {\n rels = []\n }\n\n if (rels.length) {\n if (sortProperty.startsWith('_')) {\n const sortWithoutRelationPrefix = sortProperty.replace(/^_+/, '')\n const lastFieldPath = rels.at(-1)?.fieldPath as string\n if (sortWithoutRelationPrefix.startsWith(lastFieldPath)) {\n sortProperty = sortWithoutRelationPrefix\n }\n }\n relationLookup = rels.reduce<PipelineStage[]>((acc, { fieldPath, relationTo }) => {\n sortAggregation = sortAggregation.filter((each) => {\n if ('$lookup' in each && each.$lookup.as.replace(/^_+/, '') === fieldPath) {\n return false\n }\n\n return true\n })\n const { Model: foreignModel } = getCollection({ adapter: this, collectionSlug: relationTo })\n acc.push({\n $lookup: {\n as: fieldPath,\n foreignField: '_id',\n from: foreignModel.collection.name,\n localField: fieldPath,\n },\n })\n acc.push({ $unwind: `$${fieldPath}` })\n return acc\n }, [])\n }\n\n let $unwind: any = ''\n let $group: any = null\n if (\n isHasManyValue &&\n sortAggregation.length &&\n sortAggregation[0] &&\n '$lookup' in sortAggregation[0]\n ) {\n $unwind = { path: `$${sortAggregation[0].$lookup.as}`, preserveNullAndEmptyArrays: true }\n $group = {\n _id: {\n _field: `$${sortAggregation[0].$lookup.as}._id`,\n _sort: `$${sortProperty}`,\n },\n }\n } else if (isHasManyValue) {\n $unwind = { path: `$${args.field}`, preserveNullAndEmptyArrays: true }\n }\n\n if (!$group) {\n $group = {\n _id: {\n _field: `$${fieldPath}`,\n ...(sortProperty === fieldPath\n ? {}\n : {\n _sort: `$${sortProperty}`,\n }),\n },\n }\n }\n\n const pipeline: PipelineStage[] = [\n {\n $match: query,\n },\n ...(sortAggregation.length > 0 ? sortAggregation : []),\n ...(relationLookup?.length ? relationLookup : []),\n ...($unwind\n ? [\n {\n $unwind,\n },\n ]\n : []),\n {\n $group,\n },\n {\n $sort: {\n [sortProperty === fieldPath ? '_id._field' : '_id._sort']: sortDirection,\n },\n },\n ]\n\n const getValues = async () => {\n return Model.aggregate(pipeline, { session }).then((res) =>\n res.map((each) => ({\n [args.field]: JSON.parse(JSON.stringify(each._id._field)),\n })),\n )\n }\n\n if (args.limit) {\n pipeline.push({\n $skip: (page - 1) * args.limit,\n })\n pipeline.push({ $limit: args.limit })\n const totalDocs = await Model.aggregate(\n [\n {\n $match: query,\n },\n {\n $group: {\n _id: `$${fieldPath}`,\n },\n },\n { $count: 'count' },\n ],\n {\n session,\n },\n ).then((res) => res[0]?.count ?? 0)\n const totalPages = Math.ceil(totalDocs / args.limit)\n const hasPrevPage = page > 1\n const hasNextPage = totalPages > page\n const pagingCounter = (page - 1) * args.limit + 1\n\n return {\n hasNextPage,\n hasPrevPage,\n limit: args.limit,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n values: await getValues(),\n }\n }\n\n const values = await getValues()\n\n return {\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n page: 1,\n pagingCounter: 1,\n totalDocs: values.length,\n totalPages: 1,\n values,\n }\n}\n"],"names":["getFieldByPath","buildQuery","buildSortParam","getCollection","getSession","findDistinct","args","collectionConfig","Model","adapter","collectionSlug","collection","session","req","where","sortAggregation","sort","config","payload","fields","flattenedFields","locale","field","timestamps","query","fieldPathResult","includeRelationships","path","fieldPath","pathHasLocalized","localizedPath","replace","page","sortProperty","Object","keys","sortDirection","currentFields","foundField","rels","tempPath","insideRelation","segment","split","find","e","name","length","type","relationTo","push","collections","resolvedField","isHasManyValue","relationLookup","startsWith","sortWithoutRelationPrefix","lastFieldPath","at","reduce","acc","filter","each","$lookup","as","foreignModel","foreignField","from","localField","$unwind","$group","preserveNullAndEmptyArrays","_id","_field","_sort","pipeline","$match","$sort","getValues","aggregate","then","res","map","JSON","parse","stringify","limit","$skip","$limit","totalDocs","$count","count","totalPages","Math","ceil","hasPrevPage","hasNextPage","pagingCounter","nextPage","prevPage","values"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/db-mongodb",
3
- "version": "3.59.0-internal.ff6711a",
3
+ "version": "3.59.1",
4
4
  "description": "The officially supported MongoDB database adapter for Payload",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -49,11 +49,11 @@
49
49
  "@types/uuid": "10.0.0",
50
50
  "mongodb": "6.16.0",
51
51
  "mongodb-memory-server": "10.1.4",
52
- "@payloadcms/eslint-config": "3.28.0",
53
- "payload": "3.59.0-internal.ff6711a"
52
+ "payload": "3.59.1",
53
+ "@payloadcms/eslint-config": "3.28.0"
54
54
  },
55
55
  "peerDependencies": {
56
- "payload": "3.59.0-internal.ff6711a"
56
+ "payload": "3.59.1"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "pnpm build:types && pnpm build:swc",