【问题标题】:How can I make Mongoose (running on Node.js) run an arbitrary query string?如何让 Mongoose(在 Node.js 上运行)运行任意查询字符串?
【发布时间】:2012-01-30 03:53:57
【问题描述】:

我有一个名为“文件”的表,其中每个对象都有一个名称、一个父对象和一些其他字段。我想要做的是,给定一个文件名,找到根的路径(当父是''时出现根)。

我有一个在 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);

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

感谢大家的帮助!

【问题讨论】:

    标签: javascript mongodb node.js mongoose


    【解决方案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)
        })
    })
    

    【讨论】:

    • 如何调用它并确保调用后得到的数组包含所有元素?通过“任意查询字符串”,我的意思是发送一个 BSON 字符串(带有一些 JavaScript)到 MongoDB 服务器,执行它,然后得到结果,就像 MySQL 一样。
    • 哦哦。让我稍微改一下。
    【解决方案2】:

    也许您可以通过在文档中存储一个包含根路径的附加字段来完全避免这种情况 - 例如,一个名为 path_to_root 的 ObjectId 数组。

    然后在插入新文档时,只需复制父级path_to_root 的值并将父级的_id 附加到它上面,并将其用作新插入文档的path_to_root。 使用此策略,您可以使用 mongodb $in 查询快速查询所有文档以找到返回根目录的路径。

    如果不了解更大的上下文,不确定这是否对您有用,但只是把它扔在那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2013-01-01
      • 2016-04-04
      • 2015-04-20
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      相关资源
      最近更新 更多