Code:
const words = await this.ctx.database
.join(
{ message: 'w-message', word: 'w-message-word' },
({ message, word }) => $.and(
$.eq(message.id, word.messageId),
$.query(message, {
...guildQuery,
...userQuery,
...durationQuery,
})
)
)
.project(['word.word'])
.execute()
Error:
MongoServerError: An object representing an expression must have exactly one field: { $expr: true, platform: "onebot", guildId: "*********", timestamp: {} }
Cause:
-
$.query evaluates to { $expr, ...query }
-
the join query is assigned to sel.args[0].having and handled by (Builder#modifier -> Builder#eval ->)Builder#transformEvalExpr
-
$expr falls through, causing the Mongo error
- however,
$expr ($.quote) in where queries is handled correctly, by Builder#query)
Possible fix (untested):
if ('$expr' in query) {
const { $expr, ...restQuery } = query
return { $and: [{ $expr }, this.transformEvalExpr(restQuery, group)] }
}
Code:
Error:
Cause:
$.queryevaluates to{ $expr, ...query }the
joinquery is assigned tosel.args[0].havingand handled by (Builder#modifier->Builder#eval->)Builder#transformEvalExpr$exprfalls through, causing the Mongo error$expr($.quote) inwherequeries is handled correctly, byBuilder#query)Possible fix (untested):