sql >> データベース >  >> NoSQL >> MongoDB

2回作成されたMongoDBマングースサブドキュメント

    試行中のforEachループは、 findById()のコールバック完了を認識しません 次の反復の前に非同期メソッド。 asyncのいずれかを使用する必要があります ライブラリメソッドasync.each async.whilst 、または async.until これはforループと同等であり、asyncのコールバックが呼び出されるまで待機してから、次の反復に進みます(つまり、生成されるforループ)。

    例:

    var platform_docs = [];
    async.each(platforms, function(id, callback) {
        Platform.findById(id, function(err, platform) {
            if (platform) 
                platform_docs.push(platform);
            callback(err);
        });
    }, function(err) {
       // code to run on completion or err
       console.log(platform_docs);
    });
    

    操作全体では、 async.waterfall()> 各関数がその結果を次の関数に渡すことを可能にするメソッド。

    メソッドの最初の関数は、新しい記事を作成します。

    2番目の関数はasync.each()を使用します プラットフォームリストを反復処理するユーティリティ関数。IDごとに非同期タスクを実行して、 findByIdAndUpdate() 、およびそれらがすべて完了すると、オブジェクト変数の更新クエリの結果を次の関数に返します。

    最後の関数は、新しく作成された記事を以前のパイプラインのプラットフォームIDで更新します。

    次の例のようなもの:

    var newArticle = {},
        platforms            = req.body.platforms,
        date                 = req.body.date,
        split                = date.split("/");
    
    newArticle.title         = req.body.title;
    newArticle.description   = req.body.description;
    newArticle.date          = split[2]+'/'+split[0]+'/'+split[2];
    newArticle.link          = req.body.link;
    newArticle.body          = req.body.body;
    console.log(platforms);
    
    async.waterfall([
    
        // Create the article
        function(callback) {
            var article = new Article(newArticle);
            article.save(function(err, article){
                if (err) return callback(err);                  
                callback(null, article);
            });
        },
    
        // Query and update the platforms 
        function(articleData, callback) {
            var platform_ids = [];
            async.each(platforms, function(id, callback) {
                Platform.findByIdAndUpdate(id, 
                    { "$push": { "articles": articleData._id } },
                    { "new": true },
                    function(err, platform) {
                        if (platform) 
                            platform_ids.push(platform._id);
                        callback(err);
                    }
                );
            }, function(err) {
                // code to run on completion or err
                if (err) return callback(err);                  
                console.log(platform_ids);
                callback(null, {
                    "article": articleData,
                    "platform_ids": platform_ids
                });
            });         
        },
    
        // Update the article
        function(obj, callback) {
            var article = obj.article;
            obj.platform_ids.forEach(function(id){ article.platforms.push(id); });
            article.save(function(err, article){
                if (err) return callback(err);                  
                callback(null, article);
            });
        }   
    
    ], function(err, result) { 
    /*
        This function gets called after the above tasks 
        have called their "task callbacks"
    */
        if (err) return next(err);
        console.log(result);
        res.redirect('articles/' + result._id);
    });
    


    1. Python-Redisサーバーが利用可能かどうかを確認する方法

    2. MongoDB C#ドライバーのBsonValueとカスタムクラス

    3. ダイヤルtcp[::1]:6397:connectex:ターゲットマシンがアクティブに拒否したため、接続できませんでした

    4. マングースのネストされたドキュメントの更新に失敗しましたか?