sql >> Databáze >  >> NoSQL >> MongoDB

TypeError:callback.apply není funkce (Node.js &Mongodb)

Existují 2 způsoby, jak aktualizovat dokumenty v mongodb:

  1. najděte dokument, přeneste jej na server, změňte jej a poté jej uložte zpět do mongodb.

  2. stačí dát pokyn mongodb najít dokument, změnit jej; poté, co je mongodb hotový, vraťte výsledek/chybu jako zpětné volání.

Ve svém kódu kombinujete obě metody.

  1. s user.save(), nejprve prohledáte databázi pomocí user.findOne a stáhnete ji na server(nodejs), nyní žije v paměti vašeho počítače. Pak můžete ručně změnit data a nakonec je uložit do mongodb s uživatelem. save()

    User.findOne({ userName: req.params.userName}, function(err, user) {
    
        if (err)
            res.send(err);
    
        //this user now lives in your memory, you can manually edit it
        user.username = "somename";
        user.competitorAnalysis.firstObservation = "somethingelse";
    
        // after you finish editing, you can save it to database or send it to client
         user.save(function(err) {
            if (err)
                return res.send(err);
    
            return res.json({ message: 'User updated!' });
        });
    
  2. druhý je použít User.findOneAndUpdate().. Toto je preferováno, místo user.findOne() pak user.update(); protože ti v podstatě prohledávají databázi dvakrát. nejprve findOne() a znovu hledejte update()

Každopádně druhá metoda říká mongodb, aby aktualizoval data bez předchozího přenesení na server. Dále, teprve poté, co mongodb dokončí svou akci, obdržíte aktualizovaný soubor (nebo chybu) jako zpětné volání

User.findOneAndUpdate({ userName: req.params.userName}, 
            {
             $set: { "competitorAnalysis.firstObservation" : req.body.firstObservation,
                      "competitorAnalysis.secondObservation" : req.body.secondObservation,
                      "competitorAnalysis.thirdObservation" : req.body.thirdObservation,
                      "competitorAnalysis.brandName" : req.body.brandName,
                      "competitorAnalysis.productCategory" : req.body.productCategory
            } },
            { upsert: true },
        function(err, user) {
        //after mongodb is done updating, you are receiving the updated file as callback    

        // now you can send the error or updated file to client
        if (err)
            res.send(err);

        return res.json({ message: 'User updated!' });
        });


  1. Chyba:Nelze inicializovat klienta | mongo-connect express-session

  2. Fronta Bull:Když úloha selže, jak zastavit frontu ve zpracování zbývajících úloh?

  3. Fulltextové vyhledávání v Pymongo

  4. Chyba administrační webové konzole pro správu systému Windows Mongodb čeká na připojení na portu 28017