Node Js如何以分层的方式从数据库中获取数据



我正在编写使用NodeJs从后端获取一些数据的回代码,我希望数据库数据是这样的这样的:

data = [{
name: "Admin",
id: '1',
children: [
{ name: "Admin", id: "1" },
{ name: "groupe1", id: "2" },
{
name: "groupe2", id: "1455", children: [
{ name: "groupe2", id: "1455" },
{ name: "gro", id: "5444" },
{ name: "hhrr", id: "45" }
]
}
]
}]

这个想法很简单,我们有一个组的列表,每个组都有一个父组,我想以分层的方式显示所有的组列表,树的顶部是完成的有些组同时是父组和组,有些组只是组,如果组不是父组,我们在其父组的子数组中添加一个具有其名称和ID的对象如果这个groups是父级也就是说它有子级我们在父级的子级数组中添加一个带有ID和名称的对象,然后为这个名为children的数组对象添加属性children第一次添加一个带有组名和ID的对象等等。

我试着这样做,但它没有工作

const getParentsByType = async ({ name, _id }) => {
let parentResult = [
{
id: _id,
name: name,
children: [
{
id: _id,
name: name,
},
],
},
];
parentResult= await findParent(_id, parentResult[0].children, 0);
return parentResult;
};
const findParent = async (parentId, parentResult, itemPos) => {
let children = await Models.GroupModel.find({ parent: parentId, status: true }).select('name  _id');
for (let i = 0; i < children.length; i++) {
let childrenList = await Models.GroupModel.find({ parent: children[i]._id, status: true }).select('name  _id');

if (childrenList.length != 0) {
parentResult.push(buildParentWithChild(children[i]._id, children[i].name));
findParent(children[i]._id,parentResult.children[i],itemPos++)
} else {
parentResult.push(buildParent(children[i]._id, children[i].name));
}
}
return parentResult
};

,这是数据库的模型

const Group = mongoose.Schema({
name: {
type: String,
required: true,
},
status: {
type: Boolean,
required: true,
},


parent: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Group',
},


});

我花了两天时间试图解决这个问题,但没有结果我需要一些帮助,谢谢你

尝试解析返回的数据。它验证你的数据作为对象,我没有看到你的函数有任何问题,无论我仍然不知道你试图构建什么格式。

let children = JSON.parse(JSON.stringify(await Models.GroupModel.find({ parent: parentId, status: true }).select('name  _id')));
let childrenList = JSON.parse(JSON.stringify(await Models.GroupModel.find({ parent: children[i]._id, status: true }).select('name  _id')));

如果我理解对了,您想转换由Models.GroupModel.find返回的数组,它看起来像

var dbresult = [
{_id: "1", parent: null, name: "one"},
{_id: "2", parent: "1", name: "two"}
];

将放入分层结构中。这可以通过一个函数来完成,该函数添加给定父p的所有子节点,包括递归地添加它们的子节点。例如:

function children(p) {
var result = [];
for (r of dbresult) if (r.parent === p) {
var row = {_id: r._id, name: r.name};
var chld = children(r._id);
if (chld.length > 0) row.children = chld;
result.push(row);
}
return result;
}
console.log(JSON.stringify(children(null)));

注意,这种方法只需要一次数据库访问(以填充dbresult),因此可能比findParent函数更快。

最新更新