2016-06-16 1 views
7

Я знаю, как добавить объект в коллекцию в MongoDB с помощью Node.js, например:Как добавить объект в коллекции в другую коллекцию в MongoDB используя 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); 
    }); 
}); 

но что, если в продукте будет другой стол? Как я могу просто добавить туда объект?

Скажем, это моя схема:

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 в каждом partner и product являются по умолчанию ._id например. partner._id и product._id. Вот почему не в схеме выше. Однако я отправляя их с интерфейсной бакэнду как req.parameter - обычно вещь, но я хотел бы сказать это наверняка :)

ответ

-1

попробовать это:

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

я надеюсь, что это поможет вам

+0

Этот код добавит NEW 'product' вместо добавления' campaignList' в уже существующий – DiPix

0

Первый матч на требуемая позиция массива товаров. Вы можете подтвердить это путем проверки простой находки как:

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

Используйте позиционный $ оператор выдвинуть новый объект в массив в совпавшем элементе продукта:

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

Это не сработает. Я думаю, что это нехорошее решение для mongoose – DiPix

+0

Я тестировал это за пределами Mongoose прямо через Robomongo, и он обновлялся, как ожидалось. Возможно, есть некоторые другие детали, мешающие этому работать? Возможно, проблема связана с ссылками req.body.partnerId или req.body.dataProduct.name? – Paul

1

Лучше всего поставить ставку на схему Schema & для собственной кампании и добавить ее к Партнеру по ссылке с помощью _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); 

Хорошей практикой является поиск времени, в котором вы пытаетесь использовать полукомплексные данные гнезда или объекты с более чем двумя или тремя ключами и извлекать их в свою коллекцию. Это не только облегчает поиск этих документов, но и облегчает их использование в сочетании с другими объектами.

Обязательно позвоните по номеру .populate(), чтобы MongoDB знал, что он может вложить документы из других коллекций, иначе у вас будет только массив из ObjectId.

Смежные вопросы