const res = await db.collection(
db.collection('xz_order_shopping').where({
'snapshot.store._id': storeId,
createDate: _.and(_.gt(currentStart), _.lt(currentEnd)),
is_late_payments: true,
is_canceled: _.neq(true)
}).getTemp(),
db.collection('xz_order').where({
presetType: 'shopping',
createDate: _.and(_.gt(currentStart - 1000 * 60), _.lt(currentEnd + 1000 * 60)),
is_offline_paid: _.neq(true),
paid: _.neq(true)
}).getTemp(),
).where({
orderID: _.size(1)
}).foreighKey('xz_order_shopping.orderID').count();
1***@qq.com
- 发布:2025-10-25 00:10
- 更新:2025-10-25 16:48
- 阅读:91
产品分类: uniCloud/App
示例代码:
操作步骤:
运行查询语句
运行查询语句
预期结果:
正常查询
正常查询
实际结果:
{err: Error: e.split is not a function
at _construct (http://127.0.0.1:46530/appservice/common/vendor…}(env: Windows,mp,1.06.2504030; lib: 3.10.3)
{err: Error: e.split is not a function
at _construct (http://127.0.0.1:46530/appservice/common/vendor…}(env: Windows,mp,1.06.2504030; lib: 3.10.3)
bug描述:
客户端数据库联表查询报错,
1 个回复
青衫行者
这段 uniCloud JQL 联表查询代码存在一些明显问题和潜在的逻辑问题。
⚠️ 语法和结构问题
db.collection()括号使用错误:在进行联表查询时,第一个参数应是主表名(字符串),或者像您这样直接在第一个位置传入一个
getTemp()子句。您的代码在最外层的
db.collection()中,传递了两个独立的db.collection().where().getTemp()子句作为参数:正确写法通常是:
db.collection('table1', 'table2', 'table3').where({...})getTemp()联表(推荐):要么在一个db.collection()中传入主表名,然后用foreignKey关联其他表(可能是用getTemp()定义的临时表);要么像您尝试的,直接将所有需要联表的临时表子句作为参数传入db.collection()。如果使用您当前的形式(传入多个
getTemp()子句),正确的语法应该是将它们放在一个数组中,或者用逗号隔开作为多个参数(虽然 JQL 文档中更常见的是传入一个临时表名或一个临时表子句)。foreighKey拼写错误:函数名拼写错误,应为
foreignKey,而不是foreighKey。foreignKey使用方式不明确:您只传递了一个参数
'xz_order_shopping.orderID'。通常foreignKey是用来建立主表(或左表)和被关联表(或右表)之间关联关系的。当您直接传入两个
getTemp()子句进行联表时,foreignKey应该指定两个表的关联字段,例如:foreignKey('temp_shopping.orderID', 'temp_order.orderID')如果您只传入一个字段名,JQL 会根据约定或当前上下文来尝试关联,但在您这种复杂的
getTemp()结构下,很容易出错或不符合预期。? 潜在逻辑问题
orderID: _.size(1)的意义:这通常意味着查询结果中
orderID字段的数组大小为 1。然而,orderID字段在一个订单表中通常是字符串或数字,而不是数组。如果您确认orderID在您的表结构中是一个包含单个元素的数组,则没问题;否则,这个条件会过滤掉所有非数组或数组长度不为 1 的记录,这很可能不是您的本意。xz_order的createDate条件是:createDate: _.and(_.gt(currentStart - 1000 * 60), _.lt(currentEnd + 1000 * 60))这比第一个表的查询范围扩大了前后 1 分钟。虽然不一定是错的,但如果目的是精确匹配,应该保持一致。如果这个表是用来找匹配订单的,稍微放宽时间范围也说得通,但需要确认逻辑是否严谨。
在联表查询中,使用
getTemp()时最好给临时表取一个别名(如getTemp('temp1')),这样在foreignKey和后续的field或where中引用字段时会更清晰和准确。✅ 总结和修改建议
假设您的意图是:找到所有符合条件的
xz_order_shopping订单,并关联上符合条件的xz_order订单,然后统计总数。这是修正拼写和结构后的示例,并假设您想使用联表查询: