我是一名试图解决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
答案 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 ) ));
}