我有一个名为“files”的表,其中每个对象都有一个名称,一个父项和一些其他字段。我想要做的是,给定一个文件名,找到root的路径(当父是''时出现root。)
我有一个在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);
我还添加了“路径”字段,以防我决定提高效率:)
谢谢大家的帮助!
答案 0 :(得分: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)
})
})
答案 1 :(得分:0)
也许您可以通过在文档中存储包含root路径的附加字段来完全避免这种情况 - 例如,一个名为path_to_root
的ObjectId数组。
然后在插入新文档时,只需复制path_to_root
的父级值并将父级_id
附加到其中,并将其用作path_to_root
对于新插入的文档。
使用此策略,您可以使用mongodb $in
查询快速查询返回根目录的所有文档。
如果不了解更大的背景,不确定这是否适合你,但只是把它扔出去。