Обновить значение внутри объекта массива mongodb - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь обновить значение в моем массиве объектов. Глядя на приведенную выше схему mongoDB, я хочу найти: найдите расходы с идентификатором, совпадающим с _id, и нужно обновить поля новыми с помощью req.body. Просто нужно обновить: costType, описание, цену и статус.

MongoDB Schema

Следующий код - это то, что я пытался сделать. Во-первых, мне нужно сопоставить правильный расход, и он работает нормально, но когда я пытаюсь, чтобы house.save () показывал мне сообщение «house.save не является функцией». Поэтому я думаю, что, возможно, мне нужно использовать функцию mongoDB, чтобы получить результат.

router.put("/editExpense/:id", ensureAuthenticated, (req, res) => {
  var id = mongoose.Types.ObjectId(req.params.id);
  House.find(
    { "expensesHouse._id": id },
    {
      members: 1,
      name: 1,
      description: 1,
      address: 1,
      type: 1,
      user: 1,
      userID: 1,
      userType: 1,
      expensesHouse: { $elemMatch: { _id: id } },
      date: 1
    }
  ).then(house => {
    console.log(house);
    expenseType = req.body.expenseType;
    description = req.body.description;
    price = req.body.price;
    status = req.body.status;

    house.save().then(() => {
      req.flash("success_msg", "Expenses Updated");
      res.redirect("/houses/dashboard");
    });
  });
});

****** ОБНОВЛЕНО ******

После поиска я нашел это updateOne и после настройки, это мой окончательный результат, но таким образом я удаляю каждую запись ..

router.put("/editExpense/:id", ensureAuthenticated, (req, res) => {
  var id = mongoose.Types.ObjectId(req.params.id);
  House.updateOne(
    { "expensesHouse._id": id },
    {
      members: 1,
      name: 1,
      description: 1,
      address: 1,
      type: 1,
      user: 1,
      userID: 1,
      userType: 1,
      expensesHouse: { $elemMatch: { _id: id } },
      date: 1
    },
    { $set: { "expensesHouse.expenseType": req.body.expenseType } }
  ).then(house => {
    req.flash("success_msg", "Expenses Updated");
    res.redirect("/houses/dashboard");
  });
});

*********** RESOLUTION ********** * Я только что решил проблему, как показано ниже.

 House.updateOne(
{ "expensesHouse._id": id },
{
  $set: {
    expensesHouse: {
      expenseType: req.body.expenseType,
      description: req.body.description,
      price: req.body.price,
      status: req.body.status
    }
  }
}

1 Ответ

0 голосов
/ 30 января 2020

Вы действительно близки к тому, чтобы ответить на проблему, которая возникла у вас сейчас, по синтаксической разнице между find и UpdateOne

Это то, что Find ожидает, проверьте MongoDB docs

db.collection.find(query, projection)

Это то, что updateOne ожидает, проверьте Пн go документы

 db.collection.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)

Видите разницу? Второй параметр должен быть update, а не projection, поскольку при обновлении один возвращается

  • matchedCount , содержащий количество совпадающих документов
  • ifiedCount содержит количество измененных документов
  • upsertedId , содержащее _id для upserted документа.
  • Логическое значение, признанное как true, если операция была выполнена с записью беспокойство или ложь, если беспокойство записи было отключено.

Итак, твой код должен быть

House.updateOne(
    { "expensesHouse._id": id },
    { $set: { "expensesHouse.expenseType": req.body.expenseType } }
  ).then(house => {
    req.flash("success_msg", "Expenses Updated");
    res.redirect("/houses/dashboard");
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...