如何使用mongodb在nodejs中发送多个文档?

时间:2013-10-12 22:23:58

标签: node.js mongodb

我正在查询我的数据库,按日期扫描他们的文章。用户选择日期,服务器查找用户的书面文章ID列表,扫描文章集合中的ID,然后将请求的日期与文档的“createdAt”条目进行比较。但是如果有多个结果,我会在发送错误后得到一个'不能设置的标题。'这是我的代码:

User.find({_id: user._id}, {written: 1}, function (err, docs) {
    if (err) throw err
    for (i = 0; i < docs[0].written.length; i++) {
        Articles.find({_id: docs[0].written[i]}, function (err, docs) {
            if (err) throw err
            if (req.query.date == Math.floor(docs[0].createdAt.getTime() / 1000 / 86400)) {
                res.send(docs)
            }
        })
    }

})

1 个答案:

答案 0 :(得分:1)

你需要使用像async(https://github.com/caolan/async)或async-mini(https://github.com/ypocat/async-mini这样的东西来为你做实际的循环,然后当所有的查询都完成后你可以回复一系列文章。

或者,您可以拥有一个单独的函数,在完成所有操作后调用它。以下是使用async.each执行所需操作的一种方法。

var articles = [];
User.find({_id: user._id}, {written: 1}, function (err, docs) {
    if (err) throw err;
    async.each(docs[0].written, function(doc, done){
        Articles.find({_id: doc}, function (err, articlesFound) {
            if (err) done(err)
            if (req.query.date == Math.floor(doc.createdAt.getTime() / 1000 / 86400)) {
                articles.push(articlesFound);
            }
        });
    }, function(err){
        if(err) throw err;
        return res.send(articles);
    });

});

我认为这就是你所追求的目标。