2017-01-26 7 views
0

Я создал категории в mongoDB using node, Добавил родительское свойство для каждой вставки, чтобы определить, какая из них является родительской.Создайте объект json из категорий и подкатегорий, добавленных в mongodb с hirarchy

[{ _id: 5889a06f274afdfd6f2bf249, 
    cat_id: 1, 
    title: 'Parent Category', 
    description: '', 
    parent: null, 
    status: 1}] 

[{ _id: 5889a06f274afdfd6f2bf249, 
    cat_id: 1, 
    title: 'Child Category', 
    description: '', 
    parent: 1, 
    status: 1}] 

Теперь выход JSON должен использовать узел, когда я запрос с использованием метода db.find() из MongoDB.

{ 
    obj: [ 
    { 
    _id: "5889a06f274afdfd6f2bf249", 
    cat_id: 1, 
    title: "Parent Category", 
    description: "", 
    parent: null, 
    status: 1, 
    subcategories: [ 
     { 
     _id: "5889a06f274afdfd6f2bf249", 
     cat_id: 1, 
     title: "Child Category", 
     description: "", 
     parent: 1, 
     status: 1 

     } 
    ] 

    } 
]} 
+0

В зависимости от версии MongoDB вы должны быть в состоянии использовать [** '$ graphLookup' **] (https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/#pipe._S_graphLookup) для этой задачи. – chridam

+0

У меня есть модули, созданные в узле и с помощью REST API для вызова методов '// Получить Категории module.exports.getCategories = функция (обратный вызов, предел) { Categories.find (функция (эээ, данные) { }) .limit (предел); } ' И называя это от Апи расслоение плотной' app.get (функция '/ API/категории', (REQ, Рез) { Categories.getCategories (функция (эээ, категории) { если (ERR) { throw err; } res.json (categories); }) }); ' –

+0

Код готов и возвращает результат, но неверный набор данных. Не в состоянии понять, в чем именно ошибка. 'Categories.aggregate ([ { $ graphLookup: { из: "категории", startWith: "$ Родитель", connectFromField: "cat_id", connectToField: "родитель", как: "ПОДКАТЕГОРИЯ" }} ], обратный вызов) ' Должен быть список категорий, родительский элемент которого имеет значение null, а затем содержит категории как дочерние элементы, родительский элемент которых соответствует cat_id родительских категорий. –

ответ

0

Вы можете попробовать что-то вроде ниже.

$startWith Значение выражения для каждого входного документа сопоставляется с connectToField.

Для каждого соответствующего документа значение connectFromField соответствует рекурсивно по отношению к значению connectToField в коллекции.

Коллекция

{ "_id" : 1, "cat_id" : 1, "title" : "Parent Category", "parent" : null } 
{ "_id" : 2, "cat_id" : 2, "title" : "Child Category", "parent" : 1 } 
{ "_id" : 3, "cat_id" : 3, "title" : "Sub Child Category", "parent" : 2 } 

Запрос

Categories.aggregate([{ 
    $graphLookup: { 
     from: "categories", 
     startWith: "$cat_id", 
     connectFromField: "cat_id", 
     connectToField: "parent", 
     as: "subCategory" 
    } 
}], callback) 

Выход

{ 
    "_id": 1, 
    "cat_id": 1, 
    "title": "Parent Category", 
    "parent": null, 
    "subCategory": [{ 
     "_id": 3, 
     "cat_id": 3, 
     "title": "Sub Child Category", 
     "parent": 2 
    }, { 
     "_id": 2, 
     "cat_id": 2, 
     "title": "Child Category", 
     "parent": 1 
    }] 
} { 
    "_id": 2, 
    "cat_id": 2, 
    "title": "Child Category", 
    "parent": 1, 
    "subCategory": [{ 
     "_id": 3, 
     "cat_id": 3, 
     "title": "Sub Child Category", 
     "parent": 2 
    }] 
} { 
    "_id": 3, 
    "cat_id": 3, 
    "title": "Sub Child Category", 
    "parent": 2, 
    "subCategory": [] 
} 
+0

Я ищу другой вывод, где все категории, имеющие родительский null, на первом месте, а каждая нулевая родительская категория будет иметь подкатегории, где родительский идентификатор соответствует cat_id. См. Вывод ниже –