uni-app uniCloud.databaseForJQL 连表查询会把副表的所有数据都关联出来
uni-app uniCloud.databaseForJQL 连表查询会把副表的所有数据都关联出来
示例代码:
const recommends = db.collection('opendbs-material-recommends').getTemp()
const works = db.collection('opendbs-material-myworks').getTemp()
db.collection(recommends,works)
// .foreignKey('opendbs-material-recommends.work_id')
.get()
操作步骤:
在get.jql里执行,主表列表下的work_id数组里又包含副表所有数据;
const recommends = db.collection('opendbs-material-recommends').getTemp()
const works = db.collection('opendbs-material-myworks').getTemp()
db.collection(recommends,works)
// .foreignKey('opendbs-material-recommends.work_id')
.get()
预期结果:
正常期望是一个关联id只能查出来一条数据就对了;
实际结果:
关联id查出来表里所有的数据
bug描述:
不管是在云函数还是get.jql里,通过uniCloud.databaseForJQL连表查询,会把副表所有数据都查出来放在foreignKey关联字段下;
支付宝云免费版的bug,换到阿里云免费版 或者 支付宝云的收费版即可。
唉,一言难尽啊
跟着老师的教程走,到这就卡住了,还把老师的源码拷了过来,就是不行,原来原因在这里。不过老师的教程是非常棒的,非常感谢!!!
在uni-app中使用uniCloud进行云开发时,uniCloud.databaseForJQL
提供了一种灵活的数据查询方式,但在进行连表查询时确实需要注意性能和结果集的大小。为了避免把副表(关联表)的所有数据都关联出来,通常我们会使用特定的查询条件和字段选择来限制返回的数据。
以下是一个使用JQL(JSON Query Language)进行连表查询并限制返回字段的示例。假设我们有两个表:users
和 orders
,其中 orders
表有一个 user_id
字段作为外键关联到 users
表。
数据库结构示例
users
表:{ "_id": "user1", "name": "Alice" }
orders
表:{ "_id": "order1", "user_id": "user1", "amount": 100 }
JQL 查询示例
我们的目标是查询用户及其订单,但只返回用户的名字和订单的金额,同时限制只返回某些特定用户的订单。
// 引入uniCloud
const db = uniCloud.database()
// 定义JQL查询语句
const jql = db.command.aggregate([
{
$lookup: {
from: 'orders', // 副表名称
localField: '_id', // 主表字段,用于匹配副表的外键
foreignField: 'user_id', // 副表字段,作为外键
as: 'orders' // 结果集中的关联数据字段名
}
},
{
$match: { // 添加查询条件,限制返回的用户
'orders.amount': { $gt: 50 } // 例如,只返回订单金额大于50的用户及其订单
}
},
{
$project: { // 投影操作,限制返回的字段
_id: 0, // 不返回_id字段
name: 1, // 返回用户名字
orders: {
$map: { // 只返回订单的金额字段
input: '$orders',
as: 'order',
in: { amount: '$$order.amount' }
}
}
}
}
])
// 执行查询
db.collection('users').aggregate(jql).then(res => {
console.log(res.result)
}).catch(err => {
console.error(err)
})
在这个示例中,我们使用了$lookup
进行连表查询,通过$match
添加了查询条件以限制返回的用户,最后通过$project
和$map
操作只返回了必要的字段。这样可以有效避免返回副表的所有数据,提高查询效率和减少网络传输的数据量。
请注意,根据具体业务场景和数据结构,JQL查询语句可能需要相应调整。