2011-12-29 133 views
0

我有一個名爲「文件」的表,其中每個對象都有一個名稱,一個父級和其他一些字段。我想要做的是,給定一個文件名,找到根路徑(當父節點爲''時出現root)。如何讓Mongoose(在Node.js上運行)運行任意查詢字符串?

我有一個完美的作品時,在蒙戈終端運行一個查詢:

var currentFile = parent; 
var queue = []; 

while(currentFile !== '') { 
    var file = db.files.find({ name: currentFile }); 
    currentFile = file[0].parent; 
    queue.push(currentFile); 
} 

然而不幸的是,貓鼬不允許任意字符串查詢(據我已經從文檔看)。我可以做到這一點,如果Mongoose允許同步查詢,但我似乎無法找到這種能力。

解決

重新閱讀第一條評論後,我發現,要實現我需要什麼,我需要一個回調添加到被調用的參數時currentFile是空

if(currentFile === '') { 
    callback(); 
else 
    recursiveFunc(currentFile, callback); 

我還添加了「路徑」字段,以防我決定要更高效一點:)

謝謝各位的幫助!

回答

1

遞歸函數呢?

var queue = []; 
var currentFile = parent; 
function findStuff(currentFile) { 
    File.findOne({name: currentFile}, function(err, file) { 
     currentFile = file[0].parent; 
     queue.push(currentFile); 
     findStuff(currentFile) 
    }) 
} 

也作爲或「任意查詢字符串」,我不知道你的意思。這是標準的mongo語法。如果你想直接點擊node-mongodb-native驅動程序,你總是可以做這樣的事情。它仍然異步雖然.... https://github.com/christkv/node-mongodb-native

File.collection.find({}, function(err, files) {}); 

什麼簡單的東西?對不起,我不完全瞭解你的意圖。

var queue = []; 
var currentFile = parent; 
File.find({name: currentFile}, function(err, files) { 
    files.forEach(function(file) { 
     queue.push(file.parent) 
    }) 
}) 
+0

我怎樣才能調用它,並確保調用後獲得的數組包含所有元素? 通過「任意查詢字符串」,我的意思是發送一串BSON(帶有一些JavaScript)到MongoDB服務器,執行它,並得到結果,一個MySQL。 – user1121823 2011-12-29 20:23:40

+0

ooooh。讓我稍微改變一下。 – 2011-12-29 20:29:50

0

也許你可以通過存儲在文檔中包含的路徑爲根的附加字段完全避免這種情況 - 說的ObjectId的稱爲path_to_root的數組。

然後插入一個新的文檔時,只需複製母公司的價值path_to_root並追加父母的_id它,並以此作爲path_to_root爲新插入的原稿。 使用此策略,您可以使用mongodb $in查詢快速查詢回到根目錄的所有文檔。

不知道如果不理解更大的上下文,這可以爲你工作,但只是把它扔在那裏。