2016-06-16 10 views
7

So come aggiungere oggetto da collezione in MongoDB usando Node.js, ad esempio:Come aggiungere oggetto da collezione all'interno di un'altra raccolta in MongoDB usando Node.js

router.post('/addProduct', function (req, res) { 
    Partner.findByIdAndUpdate({ _id: req.body.partnerId }, { $push: { "products": { name: req.body.dataProduct.name } } }, { safe: true }, function (err, response) { 
     if (err) throw err; 
     res.json(response); 
    }); 
}); 

ma cosa succede se nel prodotto sarà un altro tavolo? Come posso semplicemente aggiungere oggetti lì?

Diciamo che questo è il mio schema:

var partnerSchema = new mongoose.Schema({ 
    name: String, 
    products: [ 
     { 
      name: String, 
      campaignList: [ 
       { 
        name: String, 
        type: String, 
        startDate: Date, 
        endDate: Date, 
        paymentMethod: String, 
        partnerPayout: Number, 
        ourPayout: Number 
       } 
      ] 
     }] 
}); 

ID in ogni partner e product sono di default ._id ad es. partner._id e product._id. Ecco perché non sono nello schema sopra. Comunque io li invio da frontend a BackEnd come req.parameter - normalmente cosa, ma che volevo dire di sicuro :)

risposta

-1

provare questo:

router.post('/addProduct', function (req, res) { 
     Partner.findOneAndUpdate({ _id: req.body.partnerId }, { $push: { "products": { name: req.body.dataProduct.name, $push: {"campaignList": {name: req.body.name}} } } }, { safe: true }, function (err, response) { 
      if (err) throw err; 
      res.json(response); 
     }); 
    }); 

Spero che ti aiuta

+0

Questo codice aggiungerà NUOVO 'prodotto' invece di aggiungere' campaignList' a già esistente – DiPix

0

prima partita posizione dell'array dei prodotti richiesti. È possibile confermare questa testando una semplice scoperta come:

Partner.find({_id: req.body.partnerId), 'products.name': req.body.dataProduct.name }, { 'products.$': 1}) 

Utilizzare il $ all'operatore posizionale per spingere il nuovo oggetto nella matrice nell'elemento prodotti trovati:

Partner.update({_id: req.body.partnerId), 'products.name': req.body.dataProduct.name }, { $push: { 'products.$.campaignList': { name: 'new campaign' }}}) 

Riferimento https://docs.mongodb.com/manual/reference/operator/update/positional/

+0

Non funziona. Penso che non sia una buona soluzione per mangusta – DiPix

+0

Ho provato questo fuori da Mongoose direttamente tramite Robomongo e si è aggiornato come previsto. Forse ci sono altri dettagli che impediscono il funzionamento di questo? Forse un problema con i riferimenti req.body.partnerId o req.body.dataProduct.name? – Paul

1

La tua scommessa migliore sarebbe quella di definire il modello Schema & per la campagna da solo, e aggiungerlo al Partner per riferimento utilizzando lo _id

Una buona pratica è quella di cercare i momenti in cui si sta tentando di nidificare dati semi-complessi o oggetti con più di due o tre chiavi e di estrarli nella propria raccolta. Non solo semplifica la ricerca di quei documenti, ma rende più facile utilizzarli in combinazione con altri oggetti.

Assicuratevi di chiamare .populate() durante la vostra ricerca in modo che MongoDB sappia annidare i documenti dalle altre raccolte, altrimenti avrete solo un array di ObjectId.

Problemi correlati