2011-12-29 4 views
0

私は、各オブジェクトが名前、親、および他のいくつかのフィールドを持つ「ファイル」というテーブルを持っています。私がしたいのは、ファイル名が与えられれば、ルートへのパスを見つけ出すことです(ルートは親が ''のときに起こります)。どのようにして(Node.js上で動作する)Mongooseを任意のクエリ文字列にすることができますか?

私はMongoのターミナルで実行したときに完璧に動作し、クエリがあります。残念ながら

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); 

私はもう少し効率的になると決めるために、 'path'のフィールドも追加しました:)

皆さん、ありがとうございました!

答えて

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) 
    }) 
} 

また、「任意のクエリ文字列」とは、何を意味するのかわかりません。これは標準的な文法の構文です。 node-mongodb-nativeドライバを直接起動したい場合は、常にこのようなことをすることができます。しかし、まだ非同期です。https://github.com/christkv/node-mongodb-native

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

何が簡単ですか?申し訳ありませんが、私はあなたの意図を完全に理解していません。言う、path_to_rootと呼ばれるのObjectIdの配列 -

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

私はこれを呼び出して、呼び出し後に取得する配列にすべての要素が含まれていることを確認できますか? "任意のクエリ文字列"とは、MongoDBサーバーにBSONの文字列(JavaScriptを含む)を送信して実行し、その結果を取得することを意味します。 – user1121823

+0

ooooh。私は少しそれを変更させてください。 –

0

おそらくあなたは、ルートへのパスが含まれているドキュメントで追加のフィールドを格納することによって、完全にこの問題を回避することができます。

次に、新しい文書を挿入するときは、親の値をpath_to_rootにコピーし、親の_idを追加し、新しく挿入した文書にはpath_to_rootとしてください。 この戦略を使用すると、mongodb $inクエリを使用して、ルートのすべてのドキュメントをルートに戻すことができます。

大きな文脈を理解することなく、これがうまくいくかどうかはわかりませんが、そこに投げ込んでください。