2013-04-20 137 views
1

我正在嘗試做這個mongo例子,但是在貓鼬中。在貓鼬中我似乎更加複雜。可能我正在嘗試在一個圓孔中安裝一個方形釘?貓鼬遞歸查詢父親參考

這個例子來自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(),或者在返回的查詢對象上運行exec()

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

但是,您不能使用while循環代碼來生成路徑,因此您需要使用遞歸來代替。像這樣的東西應該工作:

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()這增加了項目的開始陣列。