【问题标题】:how call synchronous mongo query in node js如何在节点 js 中调用同步 mongo 查询
【发布时间】:2017-06-30 14:22:16
【问题描述】:

我要 mongodb 集合。 首先我会调用 coll1 并获取 ids。然后我想调用 coll2 并按 ids 和其他一些字段进行搜索。

当我调用函数时,它正在返回未定义。

我怎么能等到我没有从函数中得到结果。

coll1 文档示例: {

"_id" : ObjectId(""), “container_id”:“56867887fdb391ff09d15e9”, “项目状态”:[ { “用户 ID”:1, “用户名”:“x”, “状态”:“1” }, { “用户 ID”:2, “用户名”:“y”, “状态”:“3” } ], “名称”:“成员测试” } 在此输入代码

function listMyWorkitems(user_id,callback) {
    var user_id=1;
    var workItemList = new Array();
    db.collection('containers').find({'start_date':{"$lt":new Date(2017,02,11)}}).toArray(function(err,docs){
    console.log("doc length");
    console.log(docs.length);
    for (var i = 0; i < docs.length; i++) {
            db.collection('work_items').find({"$and":[{'container_id':docs[i]._id.toString()},{'item_state':{"$elemMatch":{'user_id':user_id,'is_active':1,'state':{"$in":["1","2","3"]}}}}]}).toArray(function(err,workDocs){
            //console.log(workDocs);
            for (var i = 0; i < workDocs.length; i++) {
                    for (var j = 0; j < workDocs[i].item_state.length; j++) {
                        var doc=workDocs[i].item_state[j]
                         workItemList.push(workDocs[i].name)
                    }
                }
            });
        }
          callback(workItemList);
});
}

listMyWorkitems(user_id,funtion(err,workItemList) {
console.log(workItemList)
});

我了解异步自动概念,但它仍然返回空列表 这是我到目前为止尝试过的代码..我为集合 1 完成了,但一旦解决了,我也可以查询集合 2..

var async = require('async');
var mongojs = require("mongojs");
var db = mongojs("localhost/mc_dev");
    async.auto({
           coll1task: function(callback) {
            var idlist =[];
            console.log("ids fetch from collection 1");
            db.collection('containers').find({'start_date':{"$lt":new Date(2017,02,11)}}).toArray(function(err,docs){
             docs.forEach(function(doc){
             console.log(doc._id);
             idlist.push(doc._id);
            });});
            callback(null,idlist);
           },

       finalcontrol: [
          'coll1task',
          function(results,callback) {
            console.log(results.coll1task);
          }
       ],
},
   function(error, results) {
        console.log('error = ', error)
        console.log('results = ', results)         
    })

【问题讨论】:

    标签: mongodb nodes


    【解决方案1】:

    在 node.js 中异步执行操作的最佳方法是使用 ASYNC 或 PROMISE 等模块。

    您可以访问async 并访问该库提供的所有模块。

    异步库提供的主要模块有

    1. async.series=> 这是你可以在你的情况下使用的。 2.async.parallel
    2. async.auto => 我建议你使用它,因为它可以让你异步和同步地执行操作

    此外,您还可以使用 PROMISES,因为现在它们是 ECMA SCRIPT 6 的一部分,您还可以使用各种模块来完成这项工作。

    【讨论】:

    • 感谢您的快速回复。我是node js的新手。我明白了你想说的话..但是我将如何在我的代码中使用auto..你能在代码中帮助我吗。使用auto后我的代码将如何??
    • 您的代码中还有一些问题。你必须学习javascript中的closers,在那里你将学习如何在javascript中实现for循环。然后,当您的循环像 {j==workDocs[i].item_state.length-1} 一样结束时,您的回调应该最终出现。只需在您的汽车中使用两个功能,您将在其中运行第一个查询,然后在第二个功能中使用第一个的结果并执行进一步的步骤。
    • 是的,我必须将回调放在集合 1 查询之外。我可以在 auto 中创建 2 个函数,首先将查询 coll1,其输出将转到查询 collection2 的函数2。但是我们如何将 auto 本身称为功能......请参阅我的这个例子。
    • 'function x(callback){ async.auto({ task1: function(callback){ console.log("task1 called"); callback(null); }, task2: function(callback) { console.log("task2 called"); callback(null); }, finalTask​​: ['task1', 'task2', function(callback, results) { //这里同理:results.initialTask​​[1 ], results.task1[0], results.task2[0], results.task3[0] 返回 1; }] }); } x(function(e,d){ console.log("x 函数调用"); console.log(d); });'
    • 您可以访问coderwall.com/p/rkbavg/playing-with-async-auto获取更多参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多