Php 关于MongoDb类别层次用例的几个问题

Php 关于MongoDb类别层次用例的几个问题,php,python,mongodb,use-case,Php,Python,Mongodb,Use Case,我是一名试图解决这个问题的PHP开发人员,但我对Python知之甚少 我的第一个问题: for cat in db.categories.find( {'ancestors._id': bop_id}, {'parent_id': 1}): build_ancestors_full(cat['_id'], cat['parent_id']) def build_ancestors_full(_id, parent_id): ancestors = [] while parent_id is n

我是一名试图解决这个问题的PHP开发人员,但我对Python知之甚少

我的第一个问题:

for cat in db.categories.find(
{'ancestors._id': bop_id},
{'parent_id': 1}):
build_ancestors_full(cat['_id'], cat['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 } })
“家长id”来自哪里?它不应该只是“父母”吗

我的第二个问题:

for cat in db.categories.find(
{'ancestors._id': bop_id},
{'parent_id': 1}):
build_ancestors_full(cat['_id'], cat['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 } })
我希望您能给我一个关于这个helper函数的psuedo解释(或与PHP等效的解释), 主要有以下几行:

parent_id = parent.pop('parent')
ancestors.append(parent)
谢谢大家!

更新和回答:

示例代码中有两个错误:

第一个是'parent_id'=>应该是'parent'

二是

{'parent':1,'name':1,'slug':1,'祖先]:1})


=>祖先字段应该是_id

{'parent_id':1}在find查询中,表示您只想返回键parent_id,可以将其想象为{'parent_id':true}在mongo shell中尝试一下。此参数称为投影,也可以抑制关键点。但在本例中,它的意思是,只从找到的文档中返回“parent_id”键。但是,如果不显式抑制_id列,将返回该列

问题的第二部分:这段代码分配从find查询返回的值,在本例中,它将是一个文档,其中_id等于传递到函数-build_-full中的父_id。此文档将显示父键、名称键、荡妇键和祖先键。pop('parent')将从保存我刚才描述的文档的父变量的'parent'键中弹出一个值。祖先是一个数组,祖先。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']);
}
从你的第一个问题开始-我同意使用家长id是一种打字错误。

第2部分:

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 ) ));
}

我在功能部分遇到了更多的问题。在这个例子中,从来没有父母id的概念,我认为这是一个打字错误。另外,若我理解正确的话,parent.pop('parent')将parent作为一个带有键名、slug和祖先的数组离开。这里的祖先键不是假定为_id吗?我得到的示例部分:)parent是python中的字典,因此parent.pop('parent')将从字典中删除parent键并返回值。在多次查看文档后,我还得出结论,所讨论的家长id是一个打字错误,所以保留的字典中有我在评论中提到的3个键,对吗?