【问题标题】:Manipulating a list inside of a mongodb query在 mongodb 查询中操作列表
【发布时间】:2012-06-05 20:40:04
【问题描述】:

这里的第一个问题,所以希望我做对了......

我正在尝试做的笑话是添加到查询内的列表中,然后能够将该列表从 node.js 传递给我的客户端。我的代码(简化)如下:

socket.on('get_new', function() {   
var db = require('mongojs').connect('test', ['col1']);
var db2 = require('mongojs').connect('test', ['col2']);

db.col1.find( function(err, tups) {

    var total = [];

    if ( err || !rows ) { console.log("error") };
    else { 

          for(row in tups){ 
               var id = row['id'];

               db2.col2.find({name:id}, function(foo, bar){

                  if ( foo || !bar ) { console.log("error") }; 
                  else {

                     total += { name : bar['age'] };
                     console.log(total); //prints [ {alex:'20'}]
                  }
               }
           }
    }

  console.log(total); // prints []

}
}

正如我在代码中展示的那样,我已经放置了一些 console.log 语句来查看值,它在查询内部与之后是不同的。我猜它与这段代码的范围有关,在我看来好像在运行db.test2.find 之后,内部发生的事情在外部不存在,但我不明白为什么。提前致谢!

【问题讨论】:

    标签: javascript node.js mongodb socket.io


    【解决方案1】:

    代码是异步的。这实际上意味着您的最后一条语句:console.log(total); 在第一条语句之前执行。要打印实际总数,您需要将该代码包装在这样的函数中:

    function myFnForTotal(notifyTotal) {
    
    /* your code above the else  */
     total += someTotal;
     console.log(total); //prints [ {alex:'20'}]
     notifyTotal(total);
    /* your code below else */
    }
    
    myFnForTotal(function(total) {
      console.log(total);
    });
    

    【讨论】:

    • 刚刚编辑了我的原始代码以更清晰。该代码包含在 socket.io 函数中,所以我认为是的,而 node.js 是异步的,因为我的代码包含在更大的函数 (socket.on) 中,我希望能够在其中操作变量没有编写任何嵌套函数。
    • 还有这个:total += { bar['name'] : bar['age'] };无效。你应该做 total.push({barname:bar['age']}; bar['name'] 作为一个键也是无效的。
    • 另外你可能应该停止你正在做的事情并运行这个:amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/…它会为你省去很多头痛。
    • 没有抓住那个栏['name'],在我的实际代码中没有那个。欣赏它。
    猜你喜欢
    • 2019-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2018-07-13
    • 2016-09-06
    相关资源
    最近更新 更多