2016-06-16 15 views
7

wiem jak dodać obiekt do kolekcji w MongoDB użyciu node.js, na przykład:Jak dodać obiekt do kolekcji wewnątrz innej kolekcji w MongoDB użyciu 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); 
    }); 
}); 

ale co jeśli w produkcie będzie kolejny stół? Jak mogę po prostu dodać tam obiekt?

Powiedzmy to jest mój schemat:

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 w każdej partner i product są domyślne ._id np. partner._id i product._id. To dlatego nie ma schematu powyżej. Jednak ja wysyłając je z frontend do backend jako req.parameter - normalnie rzecz, ale chciałem powiedzieć, to na pewno :)

Odpowiedz

-1

spróbuj tego:

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

mam nadzieję, że to pomaga

+0

Ten kod doda NOWA 'product' zamiast dodać' campaignList' do już istniejących – DiPix

0

pierwszy mecz z wymagana pozycja tablicy produktów. Można to potwierdzić, testując prosty find jak:

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

Użyj pozycyjną $ Operator pchnąć nowy obiekt w tablicy w dopasowanego elementu produktu:

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

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

+0

To nie działa. Myślę, że to nie jest dobre rozwiązanie dla mangusty – DiPix

+0

Przetestowałem to poza Mongoose bezpośrednio przez Robomongo i zaktualizowałem je zgodnie z oczekiwaniami. Być może jest jakiś inny szczegół, który uniemożliwia to działanie? Być może problem z referencjami req.body.partnerId lub req.body.dataProduct.name? – Paul

1

Najprościej byłoby postawić do definiowania schematu & modelem dla kampanii na własną rękę, i dodać go do Partnera poprzez odniesienie pomocą _id

var partnerSchema = new mongoose.Schema({ 
    name: String, 
    products: [ 
     { 
      name: String, 
      campaignList: [ 
       { type : mongoose.Schema.Types.ObjectId, ref : 'campaignModel' } 
      ] 
     }] 
}); 
var campaignSchema = new mongoose.Schema({ 
    name: String, 
    type: String, 
    startDate: Date, 
    endDate: Date, 
    paymentMethod: String, 
    partnerPayout: Number, 
    ourPayout: Number 
}); 
var campaignModel = mongoose.model('campaignModel', campaignSchema); 
var partnerModel = mongoose.model('partnerSchema', partnerSchema); 

Dobrą praktyką jest wyszukiwanie czasów, w których próbujesz zagnieżdżać złożone dane lub obiekty z więcej niż dwoma lub trzema kluczami i wyodrębnić je do swojej kolekcji. Nie tylko ułatwia wyszukiwanie tych dokumentów, ale ułatwia ich używanie w połączeniu z innymi obiektami.

Podczas zapytania należy zadzwonić pod numer .populate(), aby MongoDB wiedział, że można zagnieździć dokumenty z innych kolekcji, w przeciwnym razie wystarczy mieć tablicę z numerem ObjectId.