微信小程序云开发数据库联表查找

需求分析

现在有以下集合

orders集合:

1
2
3
4
5
[
{"_id":4,"book":"novel 1","price":30,"quantity":2},
{"_id":5,"book":"science 1","price":20,"quantity":1},
{"_id":6}
]
books集合:
1
2
3
4
5
6
7
8
[
{"_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"}
]

要求进行联表查询,返回结果,匹配字段为ordersbook字段和bookstitle字段 # 代码

1
2
3
4
5
6
7
8
9
10
11
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 => console.error(err))

得到的结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[
{
"_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"
}
]
}
]
HINT:其中localField字段和foreignField字段,其中一个可以指定为Array

改进

上面的代码里会生成一个新的字段bookList,若要将查询结果直接并入上一级,可有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var db = cloud.database()
var $ = db.command.aggregate
db.collection('orders').aggregate()
.lookup({
from: "books",
localField: "book",
foreignField: "title",
as: "bookList"
})
.replaceRoot({
newRoot: $.mergeObjects([ $.arrayElemAt(['$bookList', 0]), '$$ROOT' ])
})
.project({
bookList: 0
})
.end()
.then(res => console.log(res))
.catch(err => console.error(err))
其中replaceRoot指定的是新生成的数据有哪些字段,必须传入newRoot参数 project指定要保留哪些字段,0为不保留,1为保留

引用

微信官方文档·小程序

微信小程序云开发数据库联表查找

http://wwg.xyz/miniapp-lookup/

作者

Giles

发布于

2020-03-12

更新于

2022-07-22

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×