在比如说做菜单数据的时候,我会把菜单的子项放到children属性中,然后菜单的父项和子项的id需要做一个手动自增的效果,也就是所有不管是父项还是子项,他们id属性的值都是唯一的,父项的id和子项的id不能重复。如:
{
"id":1,
"name":"首页",
"children":[
{
"id":2,
"name":"统计"
},
{
"id":3,
"name":"统计"
}
]
}
{
"id":4,
"name":"客户管理",
"children":[
{
"id":5,
"name":"客户管理"
},
{
"id":6,
"name":"用户地址"
}
]
}
{
"id":7,
"name":"系统设置",
"children":[
{
"id":8,
"name":"菜单管理"
},
{
"id":9,
"name":"权限管理"
}
]
}
// 每个id相互之间都是唯一的
// 这里的数据看起来是有序的,但实际系统操作中,id的生成往往是无序的
当我们管准备添加新的菜单数据的时候,就有可能需要手动获取最大值,并且在添加吓一条菜单数据时让他的id根据最大值+1,防止重复,获取的方法如下:
const cloudbase = require('@cloudbase/node-sdk');
const app = cloudbase.init({
env: cloudbase.SYMBOL_CURRENT_ENV,
});
const db = app.database();
const collection = db.collection('menuList')
const _ = db.command;
const $ = _.aggregate;
const res = await collection.aggregate().project({
// 先把子项id的最大值和父项的id放到同一级
id:true,
childrenMax:$.max("$children.id")
}).project({
// 比较每一个菜单中子项id和父id的大小,返回他们之中最大的哪个
maxId:$.cond({
if: $.gte(['$id', '$childrenMax']),
then: '$id',
else: '$childrenMax'
})
}).group({
// 把所有元素当成一组数据,找到这组数据中id最大的值并返回给maxId
// group需要传入一个_id,并且最终根据这个id进行分组,把_id写成常量就代表所有数据都是一组的,以便统计里面的最大maxId值
_id: 1,
maxId: $.max('$maxId')
}).end();
const maxId = res.data[0].maxId;
// res.data打印结果格式为
// {_id:1,maxId: 9}