使用Mongoose在应用程序级别加入多个集合

时间:2015-09-20 20:42:23

标签: node.js mongodb mongoose

我正在使用mongoose和nodejs进行简单的聊天服务。

我有两个模型,一个用于消息传递另一个用于读取信息;

var ChatModel = new Schema({
    to: String,
    from: String,
    message: String,
    time: {type: Date, default: Date.now}
});

var InfoModel = new Schema({
    reader: String,
    from: String,
    time: {type: Date, default: Date.now}
});

当某人(读者)检查来自其他人(来自)的传入消息时,我只是在InfoModel上记录。

我想找出使用​​读取信息向(发送)T1发送消息的不同发件人。

            Chat.distinct('from', {to: 'T1'})
            .then(
            function (data) {                 
                res.json(data);
            })

找到不同的发件人我需要迭代发件人并获取每个发件人的最新消息时间。这是我试图做的但没有用的

            Chat.distinct('from', {to: 'T1'})
            .then(
            function (data) {
                for (var i = 0; i < data.length; i++) {
                    Chat.findOne({from: data[i], to:'T1'}, 'time', {sort: {'time': -1}})
                        .then(function(d){
                            ... I need to fetch from InfoModel and compare the dates for read/unread information
                        }

                    )
                }
                res.json(result);
            })

但显然这种方法不起作用,因为我需要所有来自findOne的记录,并从InfoModel获取信息。

简单地说我需要同步的东西,或者我应该以异步的方式思考,不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

for循环中的异步函数不是一个好习惯。

for循环不会等待异步函数来调用它的回调(即完成它的工作)。它会如此快速地迭代整个循环,因为它不必等待异步函数,然后即使第一个res.json(result);尚未完成其工作,也会触发Chat.findOne({from: data[0] ....调用回调。

for (var i = 0; i < data.length; i++) {
    Chat.findOne({from: data[i], to:'T1'}, 'time', {sort: {'time': -1}})
    .then(function(d){
        // ... I need to fetch from InfoModel and compare the dates for read/unread information
    })
}

/**
 This res.json would be fired even the first Chat.findOne not yet finished.
*/
res.json(result);

你应该让迭代等待,直到从模型中提取所有数据,然后你可以在他们的回调中做res.json(result);

您总是可以使用这个令人敬畏的async node.js npm模块来控制您的异步数据流。

希望你能解决这个问题! :)