2013-12-16 2 views
0

Я разработчик PHP, пытающийся решить проблему http://docs.mongodb.org/ecosystem/use-cases/category-hierarchy/, но я мало знаю о 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) 

Спасибо!

ОБНОВЛЕНИЕ & Ответ:

Две ошибки в примерах кодов:

Первый 'parent_id' => должно быть 'родитель'

Второй

{ 'родитель ': 1,' name ': 1,' slug ': 1,' ancestors ': 1})

=> поле предков должно быть _id

ответ

0

{'parent_id': 1} в запросе поиска говорит, что вы хотите вернуть ключ parent_id, подумайте об этом как (и его можно использовать как) {'parent_id': true} попробуйте его в монго. Этот параметр называется проекцией, вы также можете подавлять клавиши. Но в этом случае он говорит: верните мне только ключ «parent_id» из найденного документа. Однако, если вы явно не подавите столбец _id, он будет возвращен.

Вторая часть вашего вопроса: этот код присваивает значение, возвращаемое из запроса поиска, в этом случае это будет документ, в котором _id равен parent_id, переданному в функцию - build_ancestors_full. В этом документе будет отображаться ключ родительского ключа, ключа имени, шлюха и предков. parent.pop ('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))); 
} 
+0

У меня больше проблем с функциональной частью. В примере никогда не существует понятия parent_id, это опечатка, я думаю. также, если я его правильно понимаю, parent.pop ('parent') оставляет родительский элемент как массив с именами ключей, slug и предками. Не предполагается ли, что ключ предков здесь _id? – Iano

+0

Часть вашего примера я получаю :) – Iano

+0

parent - это словарь в python, поэтому parent.pop ('parent') удаляет родительский ключ из словаря и возвращает значение. – user602525

Смежные вопросы