⼩程序云开发云函数leftjoin联表查询。与同个数据库下的
⼀个指定的集合做lefto。。。
云函数  left join联表查询
Aggregate.lookup
聚合阶段。联表查询。与同个数据库下的⼀个指定的集合做 left outer join(左外连接)。对该阶段的每⼀个输⼊记录,lookup 会在该记录中增加⼀个数组字段,该数组是被联表中满⾜匹配条件的记录列表。lookup 会将连接后的结果输出给下个阶段。
API 定义
lookup 有两种使⽤⽅式
1. 相等匹配
将输⼊记录的⼀个字段和被连接集合的⼀个字段进⾏相等匹配时,采⽤以下定义:
lookup({
from: <;要连接的集合名>,
localField: <;输⼊记录的要进⾏相等匹配的字段>,
foreignField: <;被连接集合的要进⾏相等匹配的字段>,
as: <;输出的数组字段名>
})
参数详细说明
参数字段说明
from要进⾏连接的另外⼀个集合的名字
localField 当前流⽔线的输⼊记录的字段名,该字段将被⽤于与 from 指定的集合的 foreignField 进⾏相等匹配。如果输⼊记录中没有该字段,则该字段的值在匹配时会被视作 null
foreignField 被连接集合的字段名,该字段会被⽤于与 localField 进⾏相等匹配。如果被连接集合的记录中没有该字段,该字段的值将在匹配时被视作 null
as 指定连接匹配出的记录列表要存放的字段名,这个数组包含的是匹配出的来⾃ from 集合的记录。如果输⼊记录中本来就已有该字段,则该字段会被覆写
这个操作等价于以下伪 SQL 操作:
SELECT *, <output array field>
FROM collection
WHERE <output array field> IN (SELECT *
FROM <collection to join>
WHERE <foreignField>= <collection.localField>);
例⼦:
2. ⾃定义连接条件、拼接⼦查询
如果需要指定除相等匹配之外的连接条件,或指定多个相等匹配条件,或需要拼接被连接集合的⼦查询结果,那可以使⽤如下定义:
lookup({
from: <;要连接的集合名>,
let: { <;变量1>: <;表达式1>, ..., <;变量n>: <;表达式n> },  pipeline: [ <;在要连接的集合上进⾏的流⽔线操作> ],  as: <;输出的数组字段名>
})
参数详细说明
参数字
说明
from要进⾏连接的另外⼀个集合的名字
let 可选。指定在 pipeline 中可以使⽤的变量,变量的值可以引⽤输⼊记录的字段,⽐如 let: { userName: '$name' } 就代表将输⼊记录的 name 字段作为变量 userName 的值。在 pipeline 中⽆法
直接访问输⼊记录的字段,必须通过 let 定义之后才能访问,访问的⽅式是在  操作符中⽤ $$变量名 的⽅式访问,⽐如 $$userName。
pipeline 指定要在被连接集合中运⾏的聚合操作。如果要返回整个集合,则该字段取值空数组 []。在 pipeline 中⽆法直接访问输⼊记录的字段,必须通过 let 定义之后才能访问,访问的⽅式是在  操作符中⽤ $$变量名 的⽅式访问,⽐如 $$userName。
as 指定连接匹配出的记录列表要存放的字段名,这个数组包含的是匹配出的来⾃ from 集合的记录。如果输⼊记录中本来就已有该字段,则该字段会被覆写
该操作等价于以下伪 SQL 语句:
SELECT *, <output array field>
FROM collection
WHERE <output array field> IN (SELECT <documents as determined from the pipeline>                              FROM <collection to join>
WHERE <pipeline> );
例⼦
⽰例
云函数三表查询
var $ = cloud.database()mand.aggregate
// 云函数⼊⼝函数
exports.main = async (event, context) => {
return cloud.database().collection("tb_approval").aggregate()
.lookup({
from: "tb_user",
localField: 'u_account',
foreignField: 'u_account',
as: 'uapproval'
})
.lookup({
from: "tb_lab",
localField: 'l_id',
foreignField: '_id',
as: 'lapproval'
})
.replaceRoot({
newRoot: $.mergeObjects([$.arrayElemAt(['$uapproval', 0]), $.arrayElemAt(['$lapproval', 0]), '$$ROOT'])
})
.project({
uapproval: 0,
lapproval: 0
})
.end({
success: function (res) {
return res;
},
fail(error) {
return error;
}
})
}
指定⼀个相等匹配条件
假设 orders 集合有以下记录:
[
{"_id":4,"book":"novel 1","price":30,"quantity":2},
{"_id":5,"book":"science 1","price":20,"quantity":1},
{"_id":6}
]
sql left join 多表连接books 集合有以下记录:
[
{"_id":"book1","author":"author 1","category":"novel","stock":10,"time":1564456048486,"title":"novel 1"},
{"_id":"book3","author":"author 3","category":"science","stock":30,"title":"science 1"},
{"_id":"book4","author":"author 3","category":"science","stock":40,"title":"science 2"},
{"_id":"book2","author":"author 2","category":"novel","stock":20,"title":"novel 2"},
{"_id":"book5","author":"author 4","category":"science","stock":50,"title":null},
{"_id":"book6","author":"author 5","category":"novel","stock":"60"}
]
以下聚合操作可以通过⼀个相等匹配条件连接 orders 和 books 集合,匹配的字段是 orders 集合的 book 字段和 books 集合的 title 字段:
const db = cloud.database() db.collection('orders').aggregate()  .lookup({
from: 'books',
localField: 'book',
foreignField: 'title',
as: 'bookList',
})
.end()
.then(res => console.log(res))  .catch(err => (err))
结果:
[
{
"_id": 4,
"book": "novel 1",
"price": 30,
"quantity": 2,
"bookList": [
{
"_id": "book1",
"title": "novel 1",
"author": "author 1",
"category": "novel",
"stock": 10
}
]
},
{
"_id": 5,
"book": "science 1",
"price": 20,
"quantity": 1,
"bookList": [
{
"_id": "book3",
"category": "science",
"title": "science 1",
"author": "author 3",
"stock": 30
}
]
},
{
"_id": 6,
"bookList": [
{
"_id": "book5",
"category": "science",
"author": "author 4",
"stock": 50,
"title": null
},
{
"_id": "book6",
"author": "author 5",
"stock": "60",
"category": "novel"
}
]
}
]
对数组字段应⽤相等匹配
假设 authors 集合有以下记录:
[
{"_id": 1, "name": "author 1", "intro": "Two-time best-selling sci-fiction novelist"},  {"_id": 3, "name": "author 3", "intro": "UCB assistant professor"},
{"_id": 4, "name": "author 4", "intro": "major in CS"}
]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。