uni-app uniCloud.databaseForJQL 连表查询会把副表的所有数据都关联出来

发布于 1周前 作者 caililin 来自 Uni-App

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关联字段下;


4 回复

支付宝云免费版的bug,换到阿里云免费版 或者 支付宝云的收费版即可。


唉,一言难尽啊

跟着老师的教程走,到这就卡住了,还把老师的源码拷了过来,就是不行,原来原因在这里。不过老师的教程是非常棒的,非常感谢!!!

在uni-app中使用uniCloud进行云开发时,uniCloud.databaseForJQL提供了一种灵活的数据查询方式,但在进行连表查询时确实需要注意性能和结果集的大小。为了避免把副表(关联表)的所有数据都关联出来,通常我们会使用特定的查询条件和字段选择来限制返回的数据。

以下是一个使用JQL(JSON Query Language)进行连表查询并限制返回字段的示例。假设我们有两个表:usersorders,其中 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查询语句可能需要相应调整。

回到顶部