有关MongoDb类别层次结构用例的一些问题

时间:2013-12-16 00:21:10

标签: php python mongodb use-case

我是一名试图解决http://docs.mongodb.org/ecosystem/use-cases/category-hierarchy/的PHP开发人员,但我对Python知之甚少。

我的第一个问题:

for cat in db.categories.find(
{'ancestors._id': bop_id},
{'parent_id': 1}):
build_ancestors_full(cat['_id'], cat['parent_id'])

'parent_id'来自哪里?难道不是只是'父母'吗?

我的第二个问题:

def build_ancestors_full(_id, parent_id):
ancestors = []
while parent_id is not None:
    parent = db.categories.find_one(
        {'_id': parent_id},
        {'parent': 1, 'name': 1, 'slug': 1, 'ancestors':1})
    parent_id = parent.pop('parent')
    ancestors.append(parent)
db.categories.update(
    {'_id': _id},
    {'$set': { 'ancestors': ancestors } })

我很感激这个辅助函数的伪解释(或PHP等价), 主要有以下几行:

parent_id = parent.pop('parent')
ancestors.append(parent)

谢谢!

更新&回答:

示例代码中有两个错误:

第一个是'parent_id'=>应该是'父母'

第二个是

{'parent':1,'name':1,'slug':1,'ancestors':1})

=>祖先字段应为_id

1 个答案:

答案 0 :(得分:0)

查找查询中的

{'parent_id':1}表示你只想返回关键字parent_id,想象它(并且可以使用它){'parent_id':true}试试看蒙戈贝壳。此参数称为投影,您也可以抑制键。但是在这个例子中它只是说,只返回找到的文档中的'parent_id'键。但是,如果您未明确禁止_id列,则会返回它。

问题的第二部分:此代码分配从查询查询返回的值,在这种情况下,它将是一个文档,其中_id等于传递给函数的parent_id - build_ancestors_full。此文档将显示父键,名称键,slut和祖先键。 parent.pop('parent')将从包含我刚才描述的文档的父变量的'parent'键中弹出一个值。祖先是一个数组,ancestors.append(parent)会将我上面描述的文档附加到祖先数组。

PHP等价物:

// get all documents that contain ancestors._id = $bop_id, only return the 'parent_id' field
$result = $db->categories->find(array('ancestors._id' => $bop_id), array('parent_id' => 1));

foreach ($result as $document) {
    build_ancestors_full($document['_id'], $document['parent_id']);
}

从你的第一个问题 - 我同意使用parent_id是一个错字。

第2部分PHP:

function build_ancestors_full($id, $parent_id) {
    $ancestors = array();
    while ($parent_id != null) {
        $parent = $db->categories->find_one(
            array('_id' => parent_id),
            array('parent' => 1, 'name' => 1, 'slug' => 1, 'ancestors' => 1));
        $parent_id = $parent['parent'];
        unset($parent['parent']);
        // array push
        $ancestors[] = $parent;
    } 
    $result = $db->categories->update(
        array('_id' => _id),
        array('$set' =>  array('ancestors' => $ancestors ) ));
}