MongoDB存储深层嵌套树 - 如何查询嵌套文档?

时间:2013-09-19 02:42:23

标签: php mongodb tree mongodb-query

我正在尝试构建一个架构来存储网站导航地图。将典型数据集描绘为站点地图,其中页面可以具有子页面,并且这些子页面可以具有更多子项。一个例子是以下对象:

$tree = array(
    'home' => array(
        'h1' => 'test',
        'h2' => 'test2',
        'copy' => 'copy here',
        'slug' => '',
        'children' => array(
            'blah' => array(
                'h1' => 'child1',
                'h2' => 'child1',
                'copy' => 'child copy here',
                'slug' => 'blah',
                'children' => array(
                    'blahsub' => array(
                        'h1' => 'subchild1',
                        'h2' => 'subchild2',
                        'copy' => 'child copy here',
                        'slug' => 'blahsub',
                        'children' => array(
                            'subsubchild1' => array(
                                'h1' => 'subsubchild1',
                                'h2' => 'subsubchild2',
                                'copy' => 'child copy here',
                                'slug' => 'subsubchild1'
                            )
                        )
                    ),
                    'subchild2' => array(
                        'h1' => 'subchild1',
                        'h2' => 'subchild2',
                        'copy' => 'child copy here',
                        'slug' => 'subchild2',
                        'children' => array(
                            'subsubchild2' => array(
                                'h1' => 'subsubchild1',
                                'h2' => 'subsubchild2',
                                'copy' => 'child copy here',
                                'slug' => 'subsubchild2'
                            )
                        )
                    ),
                    'subchild3' => array(
                        'h1' => 'subchild1',
                        'h2' => 'subchild2',
                        'copy' => 'child copy here',
                        'slug' => 'subchild3',
                        'children' => array(
                            'subsubchild3' => array(
                                'h1' => 'subsubchild1',
                                'h2' => 'subsubchild2',
                                'copy' => 'child copy here',
                                'slug' => 'subsubchild3'
                            )
                        )
                    )
                )
            ),
            'another' => array(
                'h1' => 'child2',
                'h2' => 'child2',
                'copy' => 'child copy here',
                'slug' => 'another'
            )
        )
    )
);

$ tree的每个级别都由它的URI索引,每个级别可以包含N个子级,所有子级本身都可以有子级。

我最初的想法是使用这个架构是直观的,但我不确定查询树的特定节点。我接近这种架构错了吗? (目标不是要在每个请求上进行多次查询以“构建”这样的树,而是将其拉出一次并在内存中使用它。

注意:我仍然可以进行查询以拉取整个树,然后通过下标运算符直接访问每个节点。这应该比我在树中的多个查询提供更好的性能。目前正在使用mysql,这是一个真正的瓶颈。

请分享您对此架构的意见,并在有不清楚的地方要求澄清。

谢谢!

注意 - 主要目标:我想通过它们的“索引”(也是每个节点的“slug”参数)在树中找到项目。我真的失去了从哪里开始 - 这样的查询功能是否存在?必须在具有多个查询的循环中完成吗?

1 个答案:

答案 0 :(得分:2)

此架构不是查询和更新的最佳选择。例如,您不能更新subsubchild3以保证您不会遇到竞争条件或更新过时的文档。

至于查询,目前唯一可以想到的方法是使用我认为的聚合框架。

你应该看看这个页面:http://docs.mongodb.org/manual/tutorial/model-tree-structures/关于如何在MongoDB手册中建模树结构,更具体地说是“物化路径”。在查询方面,我发现该方法取得了成功,但更新起来比较困难,您只需权衡选项并选择最适合您查询的方法。