云函数里面怎么写三表联查?
两表联查是这样
const getVoteData = await vote.aggregate()
.lookup({
from: 'voteOptions', //要联查哪个表
localField: 'optionsIDs', //本表字段
foreignField: '_id', //关联字段
as: 'optionsData' //别名
})
.match({ //关联表查询条件
optionsData: {
voteID: voteID
}
})
.end()
三表呢?有没有大佬给个 栗子
- 发布:2022-12-05 20:53
- 更新:2022-12-07 20:46
- 阅读:1512
呆狗的一生 - 呆狗的一生
点击查看。联表查询。
示例代码如下:
// 使用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 (作者)
兄弟们,文档里面有 栗子
文档里面搜索“多表联表查询”就可以定位到。
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()
呆狗的一生 - 呆狗的一生
试过没?好使不?
-
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 (作者)
而且云函数 使用getTemp() 会爆这两个错
用where(voteID=="638dddd3e1a35c299de88aa6"
)
Error: 查询参数必须为对象
.where({
voteID:"638dddd3e1a35c299de88aa6"
})
TypeError: db.collection(...).where(...).getTemp is not a function
2022-12-05 22:09
呆狗的一生 - 呆狗的一生
现在 uniCloud
把操作数据库的方式分成两种,写法上有一些区别。功能上也不尽相同,分为了
- 传统方式操作数据库
-
jql
语法
比如你上面提到的 【查询参数必须为对象】这个错误,就是传统方式
所不支持的写法。你要用如下写法
let db = uniCloud.databaseForJQL()
-
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 (作者)
回复 呆狗的一生: const map = db.collection('voteOptions','voteUsers').getTemp()
db.collection("vote",map).where(_id=="638dddd3e1a35c299de88aa6"
).get()
2022-12-05 22:40
呆狗的一生 - 呆狗的一生
我测试了,A关联B,B关联C,的确不行。我上面说的关联多张表只限于 A同时关联B和C。针对当前问题,你可以只关联两张表查询,然后再单独写一个循环来查询剩下的另一张表中的数据
呆狗的一生
记住了,这种写法得在
schema
里添加foreignKey
!2022-12-05 21:12
7***@qq.com (作者)
回复 呆狗的一生:如果是三表呢 大佬。
2022-12-05 21:31