fix(db-mongodb): hasNextPage with polymorphic joins (#11394)
Previously, `hasNextPage` was working incorrectly with polymorphic joins (that have an array of `collection`) in MongoDB. This PR fixes it and adds extra assertions to the polymorphic joins test. --------- Co-authored-by: Jarrod Flesch <jarrodmflesch@gmail.com>
This commit is contained in:
@@ -195,17 +195,17 @@ export const buildJoinAggregation = async ({
|
|||||||
const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]
|
const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]
|
||||||
|
|
||||||
aggregate.push({
|
aggregate.push({
|
||||||
$set: {
|
$addFields: {
|
||||||
[`${as}.docs`]: {
|
[`${as}.hasNextPage`]: {
|
||||||
$slice: [`$${as}.docs`, ...sliceValue],
|
$gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
aggregate.push({
|
aggregate.push({
|
||||||
$addFields: {
|
$set: {
|
||||||
[`${as}.hasNextPage`]: {
|
[`${as}.docs`]: {
|
||||||
$gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],
|
$slice: [`$${as}.docs`, ...sliceValue],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1205,6 +1205,37 @@ describe('Joins Field', () => {
|
|||||||
expect(parent.children.docs[1]?.value.id).toBe(child_1.id)
|
expect(parent.children.docs[1]?.value.id).toBe(child_1.id)
|
||||||
expect(parent.children.docs[1]?.relationTo).toBe('multiple-collections-1')
|
expect(parent.children.docs[1]?.relationTo).toBe('multiple-collections-1')
|
||||||
|
|
||||||
|
// Pagination across collections
|
||||||
|
parent = await payload.findByID({
|
||||||
|
collection: 'multiple-collections-parents',
|
||||||
|
id: parent.id,
|
||||||
|
depth: 1,
|
||||||
|
joins: {
|
||||||
|
children: {
|
||||||
|
limit: 1,
|
||||||
|
sort: 'title',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(parent.children.docs).toHaveLength(1)
|
||||||
|
expect(parent.children?.hasNextPage).toBe(true)
|
||||||
|
|
||||||
|
parent = await payload.findByID({
|
||||||
|
collection: 'multiple-collections-parents',
|
||||||
|
id: parent.id,
|
||||||
|
depth: 1,
|
||||||
|
joins: {
|
||||||
|
children: {
|
||||||
|
limit: 2,
|
||||||
|
sort: 'title',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(parent.children.docs).toHaveLength(2)
|
||||||
|
expect(parent.children?.hasNextPage).toBe(false)
|
||||||
|
|
||||||
// Sorting across collections
|
// Sorting across collections
|
||||||
parent = await payload.findByID({
|
parent = await payload.findByID({
|
||||||
collection: 'multiple-collections-parents',
|
collection: 'multiple-collections-parents',
|
||||||
|
|||||||
Reference in New Issue
Block a user