oscklm
oscklm13mo ago

optional filter

Is it possible to make a filter optional in a query? For context im trying to allow for filtering by userId, but if no userId is provided in the filter input, i just want the filter ignored.
3 Replies
oscklm
oscklmOP13mo ago
Right now i do this: Which is kind a repetitive and seems like there could be a better way.
export const list = query({
args: { paginationOpts: paginationOptsValidator, userId: v.optional(v.string()) },
handler: async (ctx, args) => {
if (!args.userId) {
const result = await ctx.db.query('sessions').order('desc').paginate(args.paginationOpts)
const page = await Promise.all(
result.page.map(async (session) => enrichSession(ctx, session))
)
return { ...result, page }
} else {
const result = await ctx.db
.query('sessions')
.filter((q) => q.eq(q.field('userId'), args.userId))
.order('desc')
.paginate(args.paginationOpts)
const page = await Promise.all(
result.page.map(async (session) => enrichSession(ctx, session))
)
return { ...result, page }
}
},
})
export const list = query({
args: { paginationOpts: paginationOptsValidator, userId: v.optional(v.string()) },
handler: async (ctx, args) => {
if (!args.userId) {
const result = await ctx.db.query('sessions').order('desc').paginate(args.paginationOpts)
const page = await Promise.all(
result.page.map(async (session) => enrichSession(ctx, session))
)
return { ...result, page }
} else {
const result = await ctx.db
.query('sessions')
.filter((q) => q.eq(q.field('userId'), args.userId))
.order('desc')
.paginate(args.paginationOpts)
const page = await Promise.all(
result.page.map(async (session) => enrichSession(ctx, session))
)
return { ...result, page }
}
},
})
Asked the convex ai bot in docs, but said there weren't any examples of a optional filter
Michal Srb
Michal Srb13mo ago
Nothing special here, it's just JavaScript:
export const list = query({
args: { paginationOpts: paginationOptsValidator, userId: v.optional(v.string()) },
handler: async (ctx, args) => {
let query = ctx.db.query('sessions')
if (args.userId !== undefined) {
query = query.filter((q) => q.eq(q.field('userId'), args.userId))
}
const result = await query.order('desc').paginate(args.paginationOpts)
const page = await Promise.all(
result.page.map(async (session) => enrichSession(ctx, session))
)
return { ...result, page }
},
})
export const list = query({
args: { paginationOpts: paginationOptsValidator, userId: v.optional(v.string()) },
handler: async (ctx, args) => {
let query = ctx.db.query('sessions')
if (args.userId !== undefined) {
query = query.filter((q) => q.eq(q.field('userId'), args.userId))
}
const result = await query.order('desc').paginate(args.paginationOpts)
const page = await Promise.all(
result.page.map(async (session) => enrichSession(ctx, session))
)
return { ...result, page }
},
})
oscklm
oscklmOP13mo ago
Thanks!

Did you find this page helpful?