如何从平面Mongo DB文档构建嵌套数组

时间:2013-10-04 18:24:38

标签: php arrays json mongodb

在我的Mongo DB文档中,我曾经有一个已经转换为嵌套文档的嵌套数组。所以,例如,现在我的文档看起来像这样:

{
    projects : {
        "id1" : {
            name : "project 1"
            parentProject : null
        },
        "id2" : {
            name : "project 2"
            parentProject : null
        },
        "id3" : {
            name : "sub project 1"
            parentProject : "id1"
        }.
    }
}

当我在PHP中获取此对象时,我有一个大小为3的数组,每个数组都以项目的ID键入:

array(
  'id1' => array('name' => 'project 1', 'parentProject' => null),
  'id2' => array('name' => 'project 2', 'parentProject' => null),
  'id3' => array('name' => 'project 3', 'parentProject' => 'id1')
)

我需要将其转换为分层数组,但我遇到了逻辑问题。有人可以帮助我将其转换为以下形式的内容:

array(
  array('ID' => 'id1', 'name' => 'project 1', 'subProjects' => 
      array('ID' => 'id3', 'name' => 'project 3', 'subProjects' => null)),
  array('ID' => 'id2', 'name' => 'project 2', 'subProjects' => null)
)

2 个答案:

答案 0 :(得分:0)

我能够提出以下解决方案:

public function createProjectHierarchy($projects, $parentId = null)
{
    $tree = array();

    foreach($projects as $projectKey => $project)
    {
        if($parentId == $project['parentProjectId'])
        {
            $project['subProjects'] = self::createProjectHierarchy($projects, $projectKey);
            $project['ID'] = $projectKey;
            unset($project['parentProjectId']);
            unset($projects[$projectKey]);

            array_push($tree, $project);
        }
    }

    return $tree;
}

这将按照我需要的方式返回完全填充的层次结构。希望MongoDB很快就能支持多个位置运算符,这样我就可以将数据作为数组(和嵌套数组)保存在数据库中。

答案 1 :(得分:-1)

一种选择是将其存储在代码中所需的表单中。因此,“id3”对象可能只是“id1”项目中的一个元素。如下所示:

"id1": { 
  name:"project1", 
  subProjects:{ 
    "id3": { name:"project3" } 
  }
}

另一种选择是将每个项目存储为自己的文档,并使用MongoDB文档中的“模型树结构”数据模型之一:http://docs.mongodb.org/manual/data-modeling/