Php 关于MongoDb类别层次用例的几个问题
我是一名试图解决这个问题的PHP开发人员,但我对Python知之甚少 我的第一个问题: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
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个键,对吗?