如何使Mongoose(在Node.js上运行)运行任意查询字符串?

时间:2011-12-29 20:01:38

标签: javascript mongodb node.js mongoose

我有一个名为“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);

我还添加了“路径”字段,以防我决定提高效率:)

谢谢大家的帮助!

2 个答案:

答案 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查询快速查询返回根目录的所有文档。

如果不了解更大的背景,不确定这是否适合你,但只是把它扔出去。