猫鼬删除分层数据

时间:2021-07-13 12:03:33

标签: javascript mongoose aggregate hierarchy hierarchical-data

我有一个包含一堆架构的集合,看起来像这样:

_id:    1
parent: null

_id:    2
parent: 1

_id:    3
parent: 1

_id:    4
parent: 2

(_id 和 parent 属于 ObjectID 类型,实际上看起来不像这样)

这转化为如下所示的层次结构:

-1
  -2
    -4
  -3

我试图从这个层次结构中删除一个项目,比如说项目 1 (_id: 1),这意味着我还需要删除所有相关的项目 (2,3,4)。我不知道该怎么做(我猜最有效的方法是使用聚合),有人可以帮助我或指出正确的方向吗?提前致谢!

[编辑]

remove(idToRemove)
function remove(node){
    Item.findByIdAndDelete(node).then(()=>{
        Item.find({parent: mongoose.Types.ObjectId(node)}).select('_id').then((d)=>{
            d.forEach(e => {
                remove(e._id)
            });
        })
    })
}

我设法让这件事正常工作,但是这会多次提取数据,这显然不是最佳的。

1 个答案:

答案 0 :(得分:1)

let arr = [
    {"id": 2, "parentId": 1, "name": "Fruits"},
    {"id": 3, "parentId": 2, "name": "apple"},
    {"id": 4, "parentId": 2, "name": "orange"},
    {"id": 5, "parentId": 2, "name": "tomato"},
    {"id": 6, "parentId": 1, "name": "Vegetables"},
    {"id": 7, "parentId": 6, "name": "carrot"},
    {"id": 8, "parentId": 6, "name": "cabbage"},
    {"id": 9, "parentId": 6, "name": "potato"},
    {"id": 10, "parentId": 6, "name": "lettuce"},
    {"id": 11, "parentId": 0, "name": "Cars"},
    {"id": 13, "parentId": 8, "name": "Cars"},
    {"id": 1, "parentId": 0, "name": "Foods"},
];

//Into a tree  parentId=0 Is a top
function convert(arr, id = 0) {
    let res = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i].parentId == id) {
            let obj = {};
            obj.idIP = arr[i].id;
            obj.ip = arr[i];
            res.push(obj);
            let func = convert.bind();
            obj.children = func(arr, arr[i].id);
        }
    }
    return res;
}