Как я могу заставить Mongoose (работающий на Node.js) запускать произвольную строку запроса? - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть таблица с именем «файлы», в которой у каждого объекта есть имя, родительский элемент и некоторые другие поля.Что я хочу сделать, это, учитывая имя файла, найти путь к корню (root возникает, когда parent равен '').

У меня есть запрос, который отлично работает при запуске в терминале Mongo:

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

Я также добавил поле 'путь' на случай, если я решу немногоболее эффективно:)

Спасибо, ребята, за помощь!

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

А как насчет рекурсивной функции?

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

А как насчет чего-нибудь попроще? Извините, я не совсем понимаю ваши намерения.

var queue = [];
var currentFile = parent;
File.find({name: currentFile}, function(err, files) {
    files.forEach(function(file) {
         queue.push(file.parent)
    })
})
0 голосов
/ 31 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...