Как обновить определенный элемент в массиве, вложенном в документ

Привет, я создаю RESTful API в Node, используя mongoose для управления данными на сайте доставки еды, который я создаю.

Я хочу настроить маршрут исправления, который удалит элемент заказа из моего массива элементов, вложенного в мой документ «Заказы», ​​на основе запроса от пользователя, идентифицирующего конкретный элемент с именем или идентификатором.

У меня есть маршрут исправления, который помещает новый элемент заказа в массив элементов, вложенный в документ «Заказы». Я хочу, чтобы этот маршрут исправления также мог удалить определенный элемент из массива на основе реквизита, такого как имя или идентификатор.

Я пытался использовать методы Update и UpdateOne, и я думаю, что просто неправильно понимаю синтаксис или что-то в этом роде, поскольку продолжаю получать ошибки.

Сервер.js:

require("dotenv").config()

const express = require("express");
const mongoose = require("mongoose");
const app = express();



mongoose.connect(process.env.DATABASE_URL)

const db = mongoose.connection

db.on("error", () => console.error(error))
db.once("open", () => console.info("connected to database"))

app.use(express.json())

const subscribersRouter = require("./routes/subscribers")
const suscribersLoginRouter = require ("./routes/login")
const restaurantsRouter = require("./routes/restaurants")
const ordersRouter = require("./routes/orders")


app.use("/subscribers", subscribersRouter)
app.use("/login", suscribersLoginRouter)
app.use("/restaurants", restaurantsRouter)
app.use("/orders", ordersRouter)


app.listen(3000, () => {
    console.info("Server has started on port 3000")
});

Модель заказа:

const mongoose = require("mongoose")

const orderSchema = new mongoose.Schema({
    userID: {
        type: String,
        required: true
    },
    total: {
        type: Number,
        required: true
    },
    items: {
        type: Array,
        required: true
    }
})

module.exports = mongoose.model("order", orderSchema)

Маршрут заказов (здесь вы увидите, что у меня есть маршрут исправления, который помещает новый элемент заказа в массив элементов, вложенный в документ «Заказы». Я хочу, чтобы этот маршрут исправления также мог удалить определенный элемент из массива на основе реквизита например, имя или идентификатор, у меня проблема: 1. Как создать оператор if, который получает обновление запускаемого элемента, и идентификатор кода, используемый в этом операторе if для фактического обновления этого элемента)

    const express = require("express")
const router = express.Router()
const Order = require("../models/order")

// Getting All

router.get("/", async (req, res) => {
    try {
        const orders = await Order.find()
        res.json(orders)
    } catch (err) {
        res.status(500).json({
            message: err.message
        })
    }
})

// Getting One
router.get("/:id", getOrder, (req, res) => {
    res.json(res.order)
})

// Creating One
router.post("/", async (req, res) => {
    const order = new Order({
        userID: req.body.userID,
        total: req.body.total,
        items: req.body.items
    })
    try {
        console.info(order)
        const newOrder = await order.save()
        res.status(201).json(newOrder)
    } catch (err) {
        res.status(400).json({
            message: err.message
        })
    }
})

// Updating One 
router.patch("/:id", getOrder, async (req, res) => {
    if (req.body.userID != null) {
        res.order.userID = req.body.userID
    }
    if (req.body.total != null) {
        res.order.total = req.body.total
    }
    if (req.body.items != null) {
        const currentItems = res.order.items
        const newItem = req.body.items
        currentItems.push(newItem)
    } 
    try {
        const updatedItems = await res.order.save()
        res.json(updatedItems)
    } catch (err) {
        res.status(400).json({
            message: err.message
        })
    }
})



// Deleting One
router.delete("/:id", getOrder, async (req, res) => {

 
    try {
        await res.order.remove()
        res.json({
            message: "Deleted Order"
        })
    } catch (err) {
        res.status(500).json({
            message: err.message
        })
    }
})


async function getOrder(req, res, next) {

    let order
    try {
        order = await Order.findById(req.params.id)
        if (order === null) {
            return res.status(404).json({
                message: "Cannot Find Order"
            })
        }
    } catch (err) {
        return res.status(500).json({
            message: err.message
        })
    }
    res.order = order
    next()
}





module.exports = router

ТЕСТ Запросы:

# ORDERS
# Get All

GET http://localhost:3000/orders

###

#Get One
GET http://localhost:3000/orders/627fe8e575a8229d0ae81e73

###

#Create One
POST http://localhost:3000/orders
Content-Type: application/json


{
    "userID": "627f8b476fa64425928750c9",
    "total":50,
    "items": [
        {
        "name": "Burder",
        "price": "R20",
        "description": "A good Fuggen Waffel"
    },
    {
        "name": "Hotdog",
        "price": "R20",
        "description": "A good Fuggen Waffel"
    },
    {
        "name": "Bunny Chow",
        "price": "R20",
        "description": "A good Fuggen Waffel"
    },
    {
        "name": "Pizza",
        "price": "R20",
        "description": "A good Fuggen Waffel"
    }

    ]
    
}


###

#Delete One or all

DELETE http://localhost:3000/orders/628202c3b208aebc7f7f8f98


###
 # Update on (add Order Item)

PATCH http://localhost:3000/orders/628202c3b208aebc7f7f8f98
Content-Type: application/json

{
    
          "items": {
        "name": "gravy",
        "price": "R20",
        "description": "A good Fuggen Waffel"
    }
    
}

###
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не уверен, что правильно вас понял. Я понял, что вам нужен маршрут PATCH, чтобы также удалить элемент из массива items по имени. Итак, вот мое решение: Поскольку вы уже получили заказ и просто хотите удалить определенный элемент из свойства items, вы можете использовать filter для этого перед сохранением документа заказа.

res.order.items = res.order.items.filter(({ name }) => name !== itemNameToRemove);

Как это:

// Updating One 
router.patch("/:id", getOrder, async(req, res) => {
  const {
    userID,
    total,
    items,
    itemNameToRemove
  } = req.body;

  if (userID != null) {
    res.order.userID = userID;
  }
  if (total != null) {
    res.order.total = total;
  }
  if (items != null) {
    const newItem = items;
    res.order.items.push(newItem);

    if (itemNameToRemove) {
      res.order.items = res.order.items.filter(({
        name
      }) => name !== itemNameToRemove);
    }
  }
  try {
    const updatedItems = await res.order.save()
    res.json(updatedItems)
  } catch (err) {
    res.status(400).json({
      message: err.message
    })
  }
})

вы можете использовать $pull для этого.

Order.update(
  { userID : "userID123" },
  {$pull : {"items" : {"name":"gravy"}}}
)

Это удалит объект с название, поскольку соус принадлежит идентификатору пользователя: идентификатор пользователя123

Другие вопросы по теме