Как обновить Array Element в мангусте - MongoDB - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь обновить коллекцию MongoDb, в которой есть массив документа с именем items. Для этой цели я использую фреймворки express и mongoose.

Вот как выглядит мой schema:

const mongoose = require("mongoose");

const Schema = mongoose.Schema;

let invoices = new Schema({
  vendor: { type: String },
  invoiceDate: { type: Date, default: Date.now },
  expectedDate: { type: Date, default: Date.now },
  billingAddress: { type: String },
  contactPerson: { type: String },
  items: [
    {
      itemID: Schema.Types.ObjectId,
      qty: { type: Number },
      unitPrice: { type: Number },
      linePrice: { type: Number }
    }
  ],
  totalPrice: { type: Number }
});

module.exports = mongoose.model("invoices", invoices);

Я хочу обновить определенный документ на сначала найдите идентификатор этого конкретного документа, а затем обновите items соответственно.

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

//end-point-4
Routes.route('/update/:id').post((req, res) => {
    invoicesDB.findById(req.params.id, (err, invoice) => {
        if(!invoice){
            res.status(404).send('Not found!');
        }else{
            invoice.vendor = req.body.vendor;
            invoice.invoiceDate = req.body.invoiceDate;
            invoice.expectedDate = req.body.expectedDate;
            invoice.billingAddress = req.body.billingAddress;
            invoice.contactPerson = req.body.contactPerson;

            //how to update items
            invoice.items = req.body.items; //this I guess, gives the answer but not sure.

            invoice.totalPrice = req.body.totalPrice;
        }
    });
});

PS: я не хочу обновлять определенный элемент в items. Я хочу обновить каждый элемент в массиве с заданным значением.

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

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Вы можете сделать обновление напрямую следующим образом:

    invoicesDB.update(
      { "_id" : :req.params.id, “items._id": “Id of item for which
                                  user needs to update” }, 
      { "$set": { “items.$.qty”: 5}}, 
      function(err, company) {
        console.log(company)
    })
0 голосов
/ 04 октября 2019

На mongoose есть '$' , который обозначает массив, и вы можете сделать это:

invoicesDB.update({_id: req.params.id}, {'$set': {
    'items.$.itemID': 'Here is where you update',
}}, function(err) { ... })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...