MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Poddokumenty MongoDB mongoose utworzone dwukrotnie

Pętla forEach w Twojej próbie nie rozpoznaje zakończenia wywołania zwrotnego findById() metoda asynchroniczna przed następną iteracją. Musisz użyć dowolnego z async metody biblioteczne async.each , async.whilst lub async.until które są równoważne pętli for i będą czekać, aż wywołanie zwrotne funkcji asynchronicznej zostanie wywołane przed przejściem do następnej iteracji (innymi słowy, pętli for, która da wynik).

Na przykład:

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);
});

Do całej operacji możesz użyć async.waterfall() metoda, która pozwala każdej funkcji przekazać swoje wyniki do następnej funkcji.

Pierwsza funkcja w metodzie tworzy nowy artykuł.

Druga funkcja używa async.each() funkcja narzędziowa do iteracji po liście platform, wykonaj asynchroniczne zadanie dla każdego identyfikatora, aby zaktualizować platformę za pomocą findByIdAndUpdate() , a po zakończeniu zwracają wyniki zapytania aktualizującego w zmiennej obiektu do następnej funkcji.

Ostatnia funkcja zaktualizuje nowo utworzony artykuł o identyfikatory platformy z poprzedniego potoku.

Coś jak w poniższym przykładzie:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. data w MongoDB:przy wstawianiu obiektów Date do bazy danych Mongo, data staje się o 1 dzień wcześniejsza niż ona sama

  2. Promuj podpola do najwyższego poziomu w projekcji bez wyświetlania wszystkich kluczy

  3. Jak usunąć pole z dokumentu MongoDB ($unset)

  4. Tablice Zip z MongoDB

  5. Obecna topologia nie obsługuje sesji