我有一个包含一堆架构的集合,看起来像这样:
_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)
});
})
})
}
我设法让这件事正常工作,但是这会多次提取数据,这显然不是最佳的。
答案 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;
}