先举例子
有数据表a1:该表的字段a2Id为a2的_id,该表只有一行记录
[
{
"_id": "654dc71a189f86f5be5c74da",
"a2Id": [
"654dc6d92139297f8b712acc", // 假设用户先选择第三条
"654dc6c0e0ec19f98d32329a",// 假设用户后选择第一条
"654dc6e32139297f8b712ca9",// 假设用户后选择第四条
"654dc6c899c6248800edce44"// 假设用户后选择第二条
],
"color": [
"蓝色",
"白色",
"红色",
"绿色"
],
"title": [
"第三条",
"第一条",
"第四条",
"第二条"
]
}
]
a1.schema.json
{
"bsonType": "object",
"properties": {
"_id": {
"description": "ID,系统自动生成"
},
"a2Id": {
"bsonType": "array",
"foreignKey": "a2._id"
}
}
}
有数据表a2:该表有四行记录
[
{
"_id": "654dc6c0e0ec19f98d32329a",
"title": "第一条"
},
{
"_id": "654dc6c899c6248800edce44",
"title": "第二条"
},
{
"_id": "654dc6d92139297f8b712acc",
"title": "第三条"
},
{
"_id": "654dc6e32139297f8b712ca9",
"title": "第四条"
}
]
a2.schema.json
{
"bsonType": "object",
"properties": {
"_id": {
"description": "ID,系统自动生成"
}
}
}
联表查询
let a1 = db.collection('a1').getTemp()
let a2 = db.collection('a2').getTemp()
db.collection(a1,a2).get()
结果:
[
{
"_id": "654dc71a189f86f5be5c74da",
"a2Id": [
{
"_id": "654dc6c0e0ec19f98d32329a",
"title": "第一条"
},
{
"_id": "654dc6c899c6248800edce44",
"title": "第二条"
},
{
"_id": "654dc6d92139297f8b712acc",
"title": "第三条"
},
{
"_id": "654dc6e32139297f8b712ca9",
"title": "第四条"
}
],
"color": [
"蓝色",
"白色",
"红色",
"绿色"
],
"title": [
"第三条",
"第一条",
"第四条",
"第二条"
]
}
]
结果中的a2Id的联表记录,简直离了个大谱,默认按表2的添加记录的时间排序了,干嘛要默认按你们的方式排行序,这不给我们添加麻烦么,而且文档也没有参数可以取消这种排序的。
官方能否看在写demo不易的情况下,新增个接口,取消默认联表查询的排序。或者说出你们的理由,让我死心吧。
我不认为这个数据库设计有问题,而且确实遇到类似的场景,我用这样的设计举个例子而已
深圳奥飞网络 (作者)
unwind之后会使数组变得很复杂,后期维护会很头大。
我目前使用的方法是 :
字段a2Id在联表后会失去a2Id列,从而显示联表查询的结果。所以我a2Id as newField ,newField就是原排序。我会在res.data赋值前,根据newField(原排序)重新排序a2Id 。
尽管只增加了一个步骤,我仍然认为这样增加一个步骤不够简洁,有点多此一举的感觉。感觉写起来很难受。
2023-11-15 12:28
DCloud_uniCloud_WYQ
回复 深圳奥飞网络: 非jql的话应该还能在pipeline内为副表增加一个在主表数组内的下标的字段,再按这个字段进行排序[https://uniapp.dcloud.net.cn/uniCloud/cf-database-aggregate-operator.html#indexofarray] 这样应该能达到你说的简洁的效果,但是其实也并不高效
2023-11-15 13:23
深圳奥飞网络 (作者)
回复 DCloud_uniCloud_WYQ: 谢谢告知, 感谢
2023-11-15 13:45