lieft
lieft
  • 发布:2023-11-10 14:29
  • 更新:2023-11-15 11:37
  • 阅读:120

发现bsonType为array时,联表查询的缺陷,jql默认不是按我的排序方法,而是按JQL的排序方法,这会增加很多代码量

分类:uniCloud

先举例子

有数据表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不易的情况下,新增个接口,取消默认联表查询的排序。或者说出你们的理由,让我死心吧。

我不认为这个数据库设计有问题,而且确实遇到类似的场景,我用这样的设计举个例子而已

2023-11-10 14:29 负责人:无 分享
已邀请:
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

如果非要实现你说的需求可以不使用jql语法,unwind之后再进行联表,最后用js处理一下查询结果

  • lieft (作者)

    unwind之后会使数组变得很复杂,后期维护会很头大。

    我目前使用的方法是 :

    字段a2Id在联表后会失去a2Id列,从而显示联表查询的结果。所以我a2Id as newField ,newField就是原排序。我会在res.data赋值前,根据newField(原排序)重新排序a2Id 。

    尽管只增加了一个步骤,我仍然认为这样增加一个步骤不够简洁,有点多此一举的感觉。感觉写起来很难受。

    2023-11-15 12:28

  • DCloud_uniCloud_WYQ

    回复 lieft: 非jql的话应该还能在pipeline内为副表增加一个在主表数组内的下标的字段,再按这个字段进行排序[https://uniapp.dcloud.net.cn/uniCloud/cf-database-aggregate-operator.html#indexofarray] 这样应该能达到你说的简洁的效果,但是其实也并不高效

    2023-11-15 13:23

  • lieft (作者)

    回复 DCloud_uniCloud_WYQ: 谢谢告知, 感谢

    2023-11-15 13:45

lieft

lieft (作者)

1111

lieft

lieft (作者)

别沉啊,结果到底如何?
聚合查询也是这样的啊

const dbCmd = db.command  
const $ = db.command.aggregate  
db.collection('a1').aggregate()  
  .lookup({  
    from: 'a2',  
    pipeline: $.pipeline().done(),  
    as:'a1Result'  
  })  
  .end()  

// 结果  
[  
    {  
        "_id": "654ddf98e0ec19f98d38187e",  
        "a1Result": [  
            {  
                "_id": "654dc6c0e0ec19f98d32329a",  
                "title": "第一条"  
            },  
            {  
                "_id": "654dc6c899c6248800edce44",  
                "title": "第二条"  
            },  
            {  
                "_id": "654dc6d92139297f8b712acc",  
                "title": "第三条"  
            },  
            {  
                "_id": "654dc6e32139297f8b712ca9",  
                "title": "第四条"  
            }  
        ],  
        "a2Id": [  
            "654dc6d92139297f8b712acc",  
            "654dc6c0e0ec19f98d32329a",  
            "654dc6e32139297f8b712ca9",  
            "654dc6c899c6248800edce44"  
        ],  
        "color": [  
            "蓝色",  
            "白色",  
            "红色",  
            "绿色"  
        ],  
        "title": [  
            "第三条",  
            "第一条",  
            "第四条",  
            "第二条"  
        ]  
    }  
]
lieft

lieft (作者)

别沉

lieft

lieft (作者)

1111

要回复问题请先登录注册