当前位置: 首页 > 面试题库 >

节点猫鼬在循环中查找查询不起作用

苏胤
2023-03-14
问题内容

我试图从循环中的猫鼬中获取记录。但是它没有按预期工作。我有一系列带有问题和答案的哈希,我正在尝试从数据库中查找那些问题。这是我的循环:

for (var i=0;i < answers.length;i++)
{
    console.log(i)
    var question_ans = eval('(' + answers[i]+ ')');

    var question_to_find = question_ans.question.toString()
    var ans = question_ans.ans.toString()
    console.log(ans)
    quiz.where("question",question_to_find).exec(function(err,results)
    {
        console.log(results)
        if (ans == "t")
        {
            user_type = results.t  
        }
        else if (ans == "f")
        {
            user_type=results.f      
        }
    })
}

而终端的结果是这样的:

0
t
1
f
[ { question: 'i was here',
    _id: 5301da79e8e45c8e1e7027b0,
    __v: 0,
    f: [ 'E', 'N', 'F' ],
    t: [ 'E', 'N', 'F' ] } ]
[ { question: 'WHo r u ',
    _id: 5301c6db22618cbc1602afc3,
    __v: 0,
    f: [ 'E', 'N', 'F' ],
    t: [ 'E', 'N', 'F' ] } ]

问题是我的问题在循环迭代后显示。因此,我无法处理它们。

请帮忙!问候


问题答案:

欢迎来到异步世界:-)

使用JavaScript,除了您的代码外,任何其他事情都会并行发生。这意味着在您的特定情况下,无法在循环结束之前调用回调。您有两种选择:

a)将循环从同步for循环重写为异步递归循环:

function asyncLoop( i, callback ) {
    if( i < answers.length ) {
        console.log(i)
        var question_ans = eval('(' + answers[i]+ ')');

        var question_to_find = question_ans.question.toString()
        var ans = question_ans.ans.toString()
        console.log(ans)
        quiz.where("question",question_to_find).exec(function(err,results)  {
            console.log(ans, results)
            if (ans == "t") {
                user_type = results.t  
            } else if (ans == "f") {
                user_type=results.f      
            }
            asyncLoop( i+1, callback );
        })
    } else {
        callback();
    }
}
asyncLoop( 0, function() {
    // put the code that should happen after the loop here
});

另外,我建议您学习此博客。它在异步循环阶梯上又包含两个步骤。非常有帮助,非常重要。

b)将您的异步函数调用放入格式为闭包的

(function( ans ) {})(ans);

并提供您要保留的变量(此处:)ans

for (var i=0;i < answers.length;i++) {
    console.log(i)
    var question_ans = eval('(' + answers[i]+ ')');

    var question_to_find = question_ans.question.toString()
    var ans = question_ans.ans.toString()
    console.log(ans)
    (function( ans ) {
        quiz.where("question",question_to_find).exec(function(err,results)  {
            console.log(ans, results)
            if (ans == "t") {
                user_type = results.t  
            } else if (ans == "f") {
                user_type=results.f      
            }
        })
    })(ans);
}


 类似资料:
  • 问题内容: 一般而言,我对Mongoose和MongoDB还是很陌生,所以我很难确定是否可以进行以下操作: 有更好的方法吗? 编辑 如有任何混淆,我们深表歉意。我想做的是获取所有包含有趣标签或政治标签的商品。 编辑 没有where子句的文档: 使用where子句,我得到一个空数组。 问题答案: 对于大于3.2的现代MongoDB,您可以在大多数情况下用作替代。这也有实际上做加盟,而不是什么“在服务

  • 问题内容: 我在用猫鼬填充后无法通过在文档内部匹配的值来查询文档。 我的架构是这样的: 我想让所有用户拥有例如类型为“ Gmail”的电子邮件。 以下查询返回空结果: 我不得不像这样过滤JS中的结果: 有没有办法从猫鼬直接查询类似的东西? 问题答案: @Jason Cust 已经很好地解释了它- 在这种情况下,通常最好的解决方案是更改架构,以防止通过存储在单独集合中的文档的属性进行查询。 不过,这

  • 问题内容: 我有一个问题,我希望能够获得一个集合的所有唯一城市,而我的代码如下所示: 在本地的MongoDb中,我可以做,但是似乎没有与Mongoose等效的东西。是我自己遍历所有文档的唯一选择,还是有更好的解决方案? 为了尝试使用应答者建议的基础,我尝试这样做: 但是,该字段为空,没有错误。我还希望能够仅通过名称获取所需的集合,而不是尽可能地过滤返回的内容。 问题答案: 只是为了给Mongoos

  • 问题内容: 我需要在node.js中用猫鼬返回查询的结果。 如何返回值以将值设置为变量? 我需要做的是: 为了有: 非常感谢您的回复 。 我还有另一个问题。 如何使用find或findOne在查询运算符中传递变量?喜欢 : 问题答案: 有几种方法可以实现您想要的。 1.使用猫鼬查询 在这种策略中,您的函数返回一个Mongoose查询,您以后可以使用它来调用该方法并使用它来获取结果。 然后,您可以简

  • 问题内容: 我正在尝试使用Mongoose制作动态条件,但是它并没有像我想象的那样起作用。 代码是这样的 如您所见,我正在尝试使用“索引”变量创建动态条件。有可能这样做吗? 先感谢您! 问题答案: 您需要分两步创建对象: 更新资料 现在,node.js 4+支持计算的属性名称,您可以一步完成此操作:

  • 问题内容: 是否可以查询特定日期? 我在mongo Cookbook中发现我们可以针对某个范围进行查询 ,例如: 但是可能有特定的日期吗?这不起作用: 问题答案: 如果您保存在数据库中的日期没有时间(恰好是年,月,日),那应该可行。 您保存的日期可能是,其中包括时间成分。要查询这些时间,您需要创建一个包含一天中所有时刻的日期范围。