【问题标题】:Node.js: Creating multiple MongoDB docs over iterated JSON POST dataNode.js:在迭代的 JSON POST 数据上创建多个 MongoDB 文档
【发布时间】:2014-11-22 16:14:17
【问题描述】:

网页通过 POST 将 JSON 数据发送到我的 Node.js 应用程序(使用 Mongoose 的 MEAN 环境)。 JSON 文件如下所示(摘录):

   Firstname: 'XY',
   Surname: 'asd', 
   Articles: 
       [ { title: '1', description: 'XY' },
         { title: '2', description: 'XY' },
         { title: '3', description: 'XY' } 

目的是在 mongodb 数据库中创建作者,将作者添加到附加目录,存储相关文章并在作者文档中创建对这些文章的引用(代码除外)。这是处理请求的代码:

[...]
    async.waterfall([
            //Create random code for author (besides mongodb-specific id)
            function(callback){
                newAuthorCode.randomAuthorCode(function(err, code) {
                    callback(null, code);    
                });
            },

            //Save new author to db
            function(code, callback){
                var newAuthor = new Author({firstname: req.body.Firstname,
                                        surname: req.body.Surname,
                                        identcode: code
                });

                newAuthor.save(function (err){
                    callback(null, newAuthor);
                });
            },

            //Add new author to an additional directory
            function(newAuthor, callback){
                Directory.update({_id: req.user._id}, {$push: {authorids: newAuthor._id }}, function(err, update){
                    if (update){
                        callback(null);
                    }
                });
            },

            //saves articles to db
            function(callback){
                var keys = Object.keys(req.body.articles);

                for(var i=0, length=keys.length; i<length; i++){
                    var newArticle = new Article({title: req.body.Articles[keys[i]].title,
                                               description: req.body.Articles[keys[i]].description

                    });

                    newArticle.save(function (err){
                        console.log(newArticle._id); // <--- !!!!!!!
                    });
                }
                callback(null);
            }

        ], function (err, result) {
            console.log('DONE!!!');
            res.send('200');
        }); 

我的问题:

1) 我尝试输出生成的文章的所有 ID 的标记代码行仅提供最后存储的文章 ID 的 i 倍(在本例中为文章 3)。

2) 问题 1 导致我无法在作者文档(存储在不同的集合中)中创建新创建文章的引用,因为除了最后一个,我无法访问任何文章 ID!?

3) 有时作者和文章会在数据库中多次创建(两者之间有巨大的时间间隔)!?

感谢您的任何建议,因为我的想法已经不多了。

伊戈尔

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    不确定您的代码中的 newLink 是什么,但您可以试试这个:

    newArticle.save(function (err, newDoc){
        console.log(newDoc._id); // <--- !!!!!!!
    });
    

    【讨论】:

    • 感谢您的提示,但这实际上是一个错字。即使在调用 newArticle._id 时,输出也会(在上面的示例中)是文章 3 的 documentID 的三倍。
    • 我知道,由于 .save() 调用的异步特性,使用 newArticle._id 会给您相同的输出。我在上面的示例中建议使用.save() 回调的第二个参数,这样您就可以确保获得正确的._id。请注意,我将其称为 newDoc 而不是 newArticle
    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 2013-09-28
    • 1970-01-01
    • 2012-12-31
    • 2017-05-18
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多