2013-12-16 38 views
0

我是一位嘗試解決http://docs.mongodb.org/ecosystem/use-cases/category-hierarchy/的PHP開發人員,但我對Python不太瞭解。有關MongoDb類別層次結構用例的一些問題

我的第一個問題:

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) 

謝謝!

UPDATE &答案:在該示例中代碼

兩個錯誤:

首先是 'PARENT_ID'=>應該是 '父'

第二是

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

=>祖先字段應該是_id

回答

0

查找查詢中的{'parent_id':1}表示您只想返回關鍵字parent_id,認爲它像(和它可以像使用){'parent_id':true}在蒙戈殼。這個參數被稱爲投影,你也可以抑制鍵。但在這種情況下,它只是說,只能從找到的文檔中返回給我的'parent_id'鍵。但是,如果不明確禁用_id列,則會返回該列。

問題的第二部分:此代碼分配find查詢返回的值,在這種情況下,它將是_id等於傳遞到函數build_ancestors_full中的parent_id的文檔。該文檔將顯示父鍵,名稱鍵,蕩婦和祖先鍵。 parent.pop('parent')會從包含我剛描述的文檔的父變量的「父」鍵中彈出一個值。祖先是一個數組,ancestors.append(父)會將我上面描述的文檔追加到祖先數組中。

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

我在與功能部分比較麻煩。在這個例子中,從來沒有parent_id的概念,這是我認爲的一個錯字。如果我理解正確,parent.pop('parent')會將父項作爲一個數組與鍵名稱,slu and和祖先一起離開。這裏的祖先關鍵不是被假定爲_id嗎? – Iano

+0

你的例子的一部分我得到:) – Iano

+0

父是Python中的字典,所以parent.pop('父')將從字典中移除父鍵並返回值。 – user602525