2013-04-20 7 views
1

나는이 몽고 예제가하고있는 것을 정확하게하려고하지만 몽구스에서합니다. 몽구스에서는 나보다 복잡해 보입니다. 아마 둥근 구멍에 사각형의 못을 끼워 넣으 려하고있을거야?몽구스 재귀 쿼리 부모 참조

이 예는 내가 경로를 구축하기 위해 노력하고있어 http://www.codeproject.com/Articles/521713/Storing-Tree-like-Hierarchy-Structures-With-MongoD (부모 기준으로 트리 구조)

에서입니다.

var path=[]; 
var item = db.categoriesPCO.findOne({_id:"Nokia"}); 
while (item.parent !== null) { 
    item=db.categoriesPCO.findOne({_id:item.parent}); 
    path.push(item._id); 
} 
path.reverse().join('/'); 

고마워요!

답변

1

몽구스 그렇게

db.categoriesPCO.findOne({_id:"Nokia"}); 

쿼리에 대한 답변을 반환하지 않습니다, 비동기 라이브러리, 그냥 Query 객체 자체를 반환합니다. 실제로 쿼리를 실행하려면 findOne()에 콜백 함수를 전달하거나 반환 된 Query 개체에 exec()을 실행해야합니다.

db.categoriesPCO.findOne({_id:"Nokia"}, function (err, item) { 
}); 

그러나 경로 생성시 동일한 루프 코드를 사용할 수 없으므로 대신 재귀를 사용해야합니다. 이런 식으로 뭔가 작업을해야합니다 :

var path=[]; 

function addToPath(id, callback) { 
    db.categoriesPCO.findOne({_id:id}, function (err, item) { 
     if (err) { 
      return callback(err); 
     } 
     path.push(item._id); 
     if (item.parent !== null) { 
      addToPath(item.parent, callback); 
     } 
     else { 
      callback(); 
     } 
    }); 
} 

addToPath("Nokia", function (err) { 
    path.reverse().join('/'); 
}); 

NB 또한 대신 push을 반전 한 후 path 배열의 마지막에 새 항목을 보내고, 당신은의 시작 부분에 항목을 추가 path.unshift()을 사용할 수 있습니다 정렬.