Как обновить объект в массиве объекта документа в mon goose? - PullRequest
0 голосов
/ 17 апреля 2020

Моя схема пользователя выглядит следующим образом

{
  _id:ObjectId("6e9465528a15ba6")
  name: 'XYZ',
  email: 'abc@gmail.com',
  transactions: [
    {
      _id:ObjectId("5e946557a5128a15ba6"),
      date: 2020-04-09T06:00:30.000Z,
      type: 'type1',
      category: 'category1',
      description: 'some desc',
    }
  ]
}

Я хочу обновить некоторые поля транзакции с указанием c id. Но не происходит.

Я попытался найти решение, ответив на Пн goose, обновить значения в массиве объектов на этот вопрос.

Может быть мой _id имеет введите ObjectId и идентификатор, полученный из моего запроса, является строкой? Итак, как я могу решить эту проблему?

Мой код похож на это, но все еще вызывает ошибку user.transactions._id is not function

app.post('/api/update', function (req, res) {
  const {
    id,
    email,
    date,
    type,
    category,
    description
  } = req.body;

  User.findOne({email}, function (err, user) {
    if (err) {
      console.error(err);
      res.status(500)
        .json({
          error: 'Internal error please try again'
        });
    } else if (!user) {
      res.status(401)
        .json({
          error: 'Incorrect email or password'
        });
    } else {
      const objectId = mongoose.Types.ObjectId(id);
      let transaction = user.transactions._id(objectId);
      transaction.date = date;
      transaction.type = type;
      transaction.category = category;
      transaction.description = description;

      user.save((err, data) => {
        if (err) return res.send(err);
        return res.sendStatus(200);
      });
    }
  });
});

1 Ответ

0 голосов
/ 17 апреля 2020

К счастью, недавно мне пришлось сделать что-то похожее, поэтому я предлагаю вам взглянуть на эту страницу с понедельника goose документов на случай, если я что-то пропущу, но в основном вам нужно найти документ сначала обновите массив объектов.

Я бы попробовал что-то вроде этого:

User.findOne({ _id: your_user_id }, (err, data) => {
    if (err) return console.log(err);

    if (data) {

      //Mongoose has a special method (id) for subdocuments
      var transaction = data.transactions.id(your_transaction_id);
      date: new Date(),
      type: 'type2',
      category: 'category2',
      description: 'whatever',

      //data.save() saves everything, document and subdocument
      data.save((err, data) => {
        if (err) return console.log(err);
        done(null, data);
      });

    }
...