7***@qq.com
7***@qq.com
  • 发布:2022-12-05 20:53
  • 更新:2022-12-07 20:46
  • 阅读:1512

大佬们,我想请问一下 uniCloud JQL联表查询 云函数里面怎么写三表联查?

分类:uniCloud

云函数里面怎么写三表联查?
两表联查是这样
const getVoteData = await vote.aggregate()
.lookup({
from: 'voteOptions', //要联查哪个表
localField: 'optionsIDs', //本表字段
foreignField: '_id', //关联字段
as: 'optionsData' //别名
})
.match({ //关联表查询条件
optionsData: {
voteID: voteID
}
})
.end()
三表呢?有没有大佬给个 栗子

2022-12-05 20:53 负责人:无 分享
已邀请:
呆狗的一生

呆狗的一生 - 呆狗的一生

点击查看。联表查询
示例代码如下:

// 使用getTemp先过滤处理获取临时表再联表查询,推荐用法  
const order = db.collection('order').where('_id=="1"').getTemp() // 注意结尾的方法是getTemp,对order表过滤得到临时表  
const res = await db.collection(order, 'book').get() // 将获取的order表的临时表和book表进行联表查询
呆狗的一生

呆狗的一生 - 呆狗的一生

你这写法把我脑壳都看晕了

  • 7***@qq.com (作者)

    嘿嘿,两表我会,三表迷糊了


    2022-12-05 21:31

呆狗的一生

呆狗的一生 - 呆狗的一生

三张表还不是一样的:

db.collection(temp1, temp2, temp3).get()

你不会还要我把 4 张表的写法再写一遍吧!

  • 7***@qq.com (作者)

    我试一试,谢谢大佬


    2022-12-05 21:38

7***@qq.com

7***@qq.com (作者)

兄弟们,文档里面有 栗子
文档里面搜索“多表联表查询”就可以定位到。
const db = cloud.database()
const dbCmd = db.command
const $ = db.command.aggregate
let res = await db.collection('orders').aggregate()
.lookup({
from: 'books',
let: {
book_id: '$book'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.eq(['$_id', '$$book_id']))
)
.lookup({
from: 'authors',
let: {
author_id: '$author'
},
pipeline: $.pipeline()
.match(
dbCmd.expr($.eq(['$_id', '$$author_id']))
)
.done(),
as: 'authorList'
})
.done(),
as: 'bookList',
})
.end()

  • 呆狗的一生

    有辣么复杂吗,用getTemp方法啊,无论多少表,都可以联表查询。实际操作时,不应超过3张表


    2022-12-05 21:06

  • 7***@qq.com (作者)

    但是 如果查询的是 数组,这个方法就失效了


    2022-12-05 21:26

  • 7***@qq.com (作者)

    回复 呆狗的一生: 云函数 好像用不了getTemp 云函数怎么用getTemp 大佬支支招


    2022-12-05 21:27

  • 呆狗的一生

    回复 7***@qq.com: 那你说我这个不是云函数,还是啥函数呢?不太明白有什么疑惑的地方


    2022-12-05 21:31

  • 呆狗的一生

    回复 7***@qq.com: 你说个需求,我帮你写jql查询


    2022-12-05 21:32

  • 7***@qq.com (作者)

    回复 呆狗的一生: A表关联B表,B表再关联C表查询


    2022-12-05 21:34

  • 呆狗的一生

    回复 7***@qq.com:


    let temp = db.collection( A, B).where(...).getTemp()  
    db.collection(temp , C).where(...).get()

    2022-12-05 21:41

呆狗的一生

呆狗的一生 - 呆狗的一生

试过没?好使不?

  • 7***@qq.com (作者)

    let temp = db.collection('vote', 'voteOptions').where(_id=="638bc3d8f43e6046ed65b44f").getTemp()

    db.collection(temp,'voteUsers').get()

    他们现在的关系是 主'vote' 副 'voteOptions' 主'voteOptions' 副 'voteUsers' vote跟voteUsers 是没有关联的

    然后报这个错

    未找到主表与副表之间的关联关系,注意使用临时表联表查询时只会使用过滤后的字殷进行联表


    2022-12-05 21:57

  • 呆狗的一生

    回复 7***@qq.com: 应该有两个foreignKey,都在schema里添加了吗?


    2022-12-05 22:07

  • 7***@qq.com (作者)

    而且云函数 使用getTemp() 会爆这两个错

    用where(voteID=="638dddd3e1a35c299de88aa6")

    Error: 查询参数必须为对象

    .where({

    voteID:"638dddd3e1a35c299de88aa6"

    })

    TypeError: db.collection(...).where(...).getTemp is not a function


    2022-12-05 22:09

  • 7***@qq.com (作者)

    回复 呆狗的一生: 添加了的 A关B B关C A跟C没关


    2022-12-05 22:10

  • 呆狗的一生

    回复 7***@qq.com: 【查询参数必须为对象】这个错误,是应该用


    uniCloud.databaseForJQL()

    2022-12-05 22:15

7***@qq.com

7***@qq.com (作者)

添加了的 A关B B关C A跟C没关

呆狗的一生

呆狗的一生 - 呆狗的一生

现在 uniCloud把操作数据库的方式分成两种,写法上有一些区别。功能上也不尽相同,分为了

  1. 传统方式操作数据库
  2. jql语法

比如你上面提到的 【查询参数必须为对象】这个错误,就是传统方式所不支持的写法。你要用如下写法

let db = uniCloud.databaseForJQL()
  • 7***@qq.com (作者)

    感谢,我看了你之前的帖子,这个问题解决了。我再尝试一下


    2022-12-05 22:20

  • 呆狗的一生

    回复 7***@qq.com: 哟西,解决就行


    2022-12-05 22:25

  • 7***@qq.com (作者)

    回复 呆狗的一生: const voteUsers = db.collection('voteUsers').getTemp();

    const voteOptions = db.collection('voteOptions',voteUsers).where(voteID=="638dddd3e1a35c299de88aa6").getTemp()

    db.collection("vote",voteOptions).where(_id=="638dddd3e1a35c299de88aa6").get()

    现在A联B 但是在B表里面 C没有联上。。


    2022-12-05 22:27

  • 7***@qq.com (作者)

    回复 呆狗的一生: [

    {

    "_id": "638dddd3e1a35c299de88aa6",

    "_openid": "ovTp_5b4Mw1kTWmfGxTx6GOGPU-A",

    "data": {

    "anonymity": false,

    "avatarUrl": "https://thirdwx.qlogo.cn/mmopen/vi_32/yy4RlSUfRR3lHKp8ncVoyeBamxSo3Y6uBZ0jwveFetQ9ic0dsvP67O4bjwwBgrBJLWDOfawXLr0Xxo3jDCWsnag/132",

    "beginTimestamp": 1670179860000,

    "endTimestamp": 1670352660000,

    "fillOutForm": false,

    "formContent": [

    ],

    "hiddenVotes": false,

    "nickName": "(๑・ . ・๑)",

    "plazaShow": false,

    "randomUpset": false,

    "requireForm": true,

    "textExplain": "123131",

    "textImage": [

    ],

    "textTitle": "31231",

    "voteMax": 1,

    "voteMin": 1,

    "voteModel": "单选投票",

    "voteNum": "仅限一次",

    "voteType": true

    },

    "optionsIDs": [

    {

    "_id": "638dddd3f5cf3a959a503b0d",

    "_openid": "ovTp_5b4Mw1kTWmfGxTx6GOGPU-A",

    "fileID": "https://mp-59b3a719-11a8-4e57-8afd-6ccbc0feb772.cdn.bspapp.com/cloudstorage/0f16fdf8-5371-4099-bf09-c2eb3a58b25c.jpg",

    "index": 1,

    "indexAll": 2,

    "value": "123123",

    "voteID": "638dddd3e1a35c299de88aa6",

    "voteUsersIDs": [

    "638dec8ef5cf3a959a50a64a"

    ]

    },

    {

    "_id": "638dddd3f5cf3a959a503b0e",

    "_openid": "ovTp_5b4Mw1kTWmfGxTx6GOGPU-A",

    "fileID": "https://mp-59b3a719-11a8-4e57-8afd-6ccbc0feb772.cdn.bspapp.com/cloudstorage/1b0a3f9a-be38-44ab-b74d-2eac983654ad.jpg",

    "index": 2,

    "indexAll": 2,

    "value": "23131",

    "voteID": "638dddd3e1a35c299de88aa6"

    }

    ],

    "time": 1670241747842

    }

    ]


    voteUsersIDs下面的ID没有联上


    但是单独用两张表去联 是可以。很奇怪


    2022-12-05 22:29

  • 呆狗的一生

    回复 7***@qq.com: 是 vote 表和voteOptions表没有联上吗


    2022-12-05 22:32

  • 7***@qq.com (作者)

    回复 呆狗的一生: vote 下面有voteOptions voteOptions下面没有voteUsers


    2022-12-05 22:34

  • 7***@qq.com (作者)

    回复 呆狗的一生: const map = db.collection('voteOptions','voteUsers').getTemp()

    db.collection("vote",map).where(_id=="638dddd3e1a35c299de88aa6").get()


    2022-12-05 22:40

  • 7***@qq.com (作者)

    回复 呆狗的一生: 我好像找到原因了。。。。管理员说过,,jql不支持多层级嵌套联表


    2022-12-05 22:47

  • 呆狗的一生

    回复 7***@qq.com: 我正在试。。。。


    2022-12-05 22:52

  • 7***@qq.com (作者)

    回复 呆狗的一生: 方便加个联系方式吗?一起学习,嘿嘿


    2022-12-05 23:00

  • 呆狗的一生

    回复 7***@qq.com: 算了吧,论坛里关注我就行


    2022-12-05 23:34

  • 7***@qq.com (作者)

    回复 呆狗的一生: 试出来了吗?我这边还是不行


    2022-12-05 23:45

  • 呆狗的一生

    回复 7***@qq.com: 把这3个表的schema给我看看


    2022-12-07 17:26

呆狗的一生

呆狗的一生 - 呆狗的一生

我测试了,A关联B,B关联C,的确不行。我上面说的关联多张表只限于 A同时关联B和C。针对当前问题,你可以只关联两张表查询,然后再单独写一个循环来查询剩下的另一张表中的数据

  • 7***@qq.com (作者)

    嗯嗯,我现在就是用这个方法,也可以用lookup这个方法,但是会比较不美观


    2022-12-07 23:42

要回复问题请先登录注册