Как обновить поле в массиве, найдя парентид и дочерний идентификатор nodejs

Здесь показывается ошибка TypeError: User.save is not a function

const express = require("express");
require("dotenv").config("../.env");
const User = require("../models/User");
const auth = require("../middleware/auth");
const ObjectId = require("mongoose").Types.ObjectId;
const HttpStatus = require("http-status");

router.post("/admin/update/:userid/:issueid", async (req, res) => {
  var status = req.body.status;
  var userId = req.params.userid;
  var issueId = req.params.issueid;

  if (isNull(issueId & userId) || !ObjectId.isValid(issueId & userId)) {
    return ReE(
      res,
      { message: "Please provide a valid issueId and userID" },
      HttpStatus.BAD_REQUEST
    );
  }

  var found = User.find({
    $and: [{ "User._id": userId }, { "User.issues._id": issueId }]
  });

  if (!found) {
    return ReE(res, "User or Issue not found", 400);
  }

  found.status = status;

  let updatedUser;
  [err, updatedUser] = await to(user.save());
  if (err) {
    return ReE(res, err, 500);
  }

  ReS(res, "Issue Updated", HttpStatus.OK);
});

Всего 2 ответа


TypeError: User.save не является функцией

Вы не написали ни одной функции как User.save и пытались вызвать эту функцию.

  [err, updatedUser] = await to(user.save());

Это причина ошибки


Вам нужно использовать found.save() вместо user.save() .

Также этот тип обновления может быть выполнен за один раз с использованием позиционного оператора mongodb $ .

router.post("/admin/update/:userid/:issueid", async (req, res) => {
  var status = req.body.status;
  var userId = req.params.userid;
  var issueId = req.params.issueid;

  if (isNull(issueId & userId) || !ObjectId.isValid(issueId & userId)) {
    return ReE(
      res,
      { message: "Please provide a valid issueId and userID" },
      HttpStatus.BAD_REQUEST
    );
  }

  let updatedUser;

  [err, updatedUser] = await to(
    User.findByIdAndUpdate(
      userId,
      { $inc: { "issues.$[inner].status": status } },
      { arrayFilters: [{ "inner._id": issueId }], new: true }
    )
  );

  if (err) {
    return ReE(res, err, 500);
  }

  if (!updatedUser) {
    return ReE(res, "User or Issue not found", 400);
  }

  ReS(res, "Issue Updated", HttpStatus.OK);
});

Есть идеи?

10000