无法将MongoDB集合转换为列表


  • 註冊用戶

    我要将一个MongoDB的集合转换成一个列表,但是始终不成功,代码如下:

    var MongoClient = require('mongodb').MongoClient;
    getPost: function(callback){
        MongoClient.connect(url, function(err, db){
            var cursor = db.collection('post').find();
            var list = [];
            cursor.forEach(function(doc){
                list.push(doc);
            });
            callback(list);
        })
    }

    list一直是[]

    请教该如何解决


  • 大中华区MongoDB顾问

    其实这是一个跟MongoDB没有直接关系的问题。NodeJS中需要等待的操作都是异步的,特别是出现了I/O的部分(包括磁盘、网络I/O)一般来说都是异步的。

    很显然,find()在实际获取数据的那一刻,也就是forEach的时候肯定是需要等待数据库,所以:

    function(doc){
        list.push(doc);
    }

    是会在另外一个时刻(数据准备就绪时)被唤醒并执行的,而callback(list)则会马上被执行,所以callback的时候list仍然是[]。

    如果这个查询的结果不是很大,可以考虑:

    cursor.toArray(function(err, docs) {
        if (err) throw err;
        callback(docs);
    });

    同时注意大部分时候callback的签名都是function(err, doc),所以你那个签名可能会得到一堆null,因为第一个参数是err,一般都是null。


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待