2011-12-29 76 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查询快速查询回到根目录的所有文档。

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