2011-12-29 3 views
0

У меня есть таблица под названием «файлы», в которой каждый объект имеет имя, родительский элемент и некоторые другие поля. То, что я хочу сделать, это указать имя файла, найти путь к корню (корень возникает, когда parent is ').Как я могу заставить 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 не позволяет (насколько я видел из документации) произвольных строк запросов. Я мог бы это сделать, если 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) 
    }) 
} 

Также как или «произвольная строка запроса», я не уверен, что вы имеете в виду. Это стандартный синтаксис манго. Если вы хотите напрямую нажать на собственный драйвер node-mongodb, вы всегда можете сделать что-то подобное. Это все еще ASync хотя .... 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, выполнить ее и получить результаты a la MySQL. – user1121823

+0

ooooh. позвольте мне немного изменить его. –

0

Может быть, вы могли бы избежать этого полностью, сохраняя дополнительное поле в документах, содержащий путь к корню - скажем, массив ObjectId называеться path_to_root.

Затем при вставке нового документа, просто скопировать значение родителя для path_to_root и добавьте родителя _id к нему, и использовать это в качестве path_to_root для вновь вставленного документа. С помощью этой стратегии вы можете быстро запросить все документы для пути до корня, используя запрос mongodb $in.

Не уверен, что это может сработать для вас, не понимая более широкого контекста, а просто бросайте его туда.

Смежные вопросы