NodeJS 节点J如何以分层方式从数据库中获取数据

vx6bjr1n  于 2022-12-22  发布在  Node.js
关注(0)|答案(2)|浏览(128)

我正在写一个使用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的对象,如果该组是"这意味着它有孩子我们添加一个对象与它的ID和名称在数组中的儿童他的父母,我们添加属性儿童的对象是数组命名儿童与第一次对象与名称和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',
  },
 
 

});

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

e3bfsja2

e3bfsja21#

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

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')));
nvbavucw

nvbavucw2#

如果我没理解错的话,您需要转换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函数更快。

相关问题