Node/JS mongoose REST API 如何将新的 object 推入 object 的嵌套数组中 collection

Node/JS mongoose REST API How to push a new object into a nested array of objects all in one collection

Noob MERN Stack Dev 在这里,我正在构建一个小的送餐练习 Web 应用程序。我已经开始创建一个基本的 RESTful API 来为我的外卖网站提供服务。

我目前正在尝试构建数据库。我有一个餐厅 collection,其中包含每个餐厅都有图像来源、标题、描述和菜单。菜单是一个嵌套数组。 我想这样做,以便用户能够将新菜单项推送到他们餐厅的菜单数组中,并从该数组中删除选定的项目。我一直在尝试弄清楚如何使用补丁来做到这一点,但似乎无法找到有效的解决方案。任何帮助将不胜感激。

SERVER.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.log("connected to database"))

app.use(express.json())

const subscribersRouter = require("./routes/subscribers")
const restaurantsRouter = require("./routes/restaurants")

app.use("/subscribers", subscribersRouter)
app.use("/restaurants", restaurantsRouter)

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

架构和模型:

   const mongoose = require("mongoose")


const menueSchema = new mongoose.Schema({
    name: String,
    price: String,
    description: String

})


const restaurantSchema = new mongoose.Schema({
    src: {
        type: String,
        required: true

    },
    title: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true

    },
    menue: {
        type: menueSchema,
        required: true
    }

})

module.exports = mongoose.model("restaurant", restaurantSchema)

路线:

const express = require("express")
const router = express.Router()
const Restaurant = require("../models/restaurant")


// Getting All

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

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

// Creating One
router.post("/", async (req, res) => {
    const restaurant = new Restaurant({
        src: req.body.src,
        title: req.body.title,
        description: req.body.description,
        menue: req.body.menue
    })
    try {
        const newRestaurant = await restaurant.save()
        res.status(201).json(newRestaurant)
    } catch (err) {
        res.status(400).json({
            message: err.message
        })
    }
})

// Updateing One 
router.patch("/:id", getRestaurant, async (req, res) => {
    if (req.body.name != null) {
        res.restaurant.name = req.body.name
    }
    if (req.body.title != null) {
        res.restaurant.title = req.body.title
    }
    if (req.body.description != null) {
        res.restaurant.description = req.body.description
    }
    if (req.body.menue != null) {
        res.restaurant.menue = req.body.menue
    }
    try {
        const updatedRestaurant = await res.restaurant.save()
        res.json(updatedRestaurant)
    } catch (err) {
        res.status(400).json({
            message: err.message
        })
    }
})

// Update Menue 

router.patch("/:id", getRestaurant, async (req, res) => {
    try {
        console.log(res.resturants.menue)


    } catch (err) {

    }
})

// Deleting One
router.delete("/:id", getRestaurant, async (req, res) => {
    try {
        await res.restaurant.remove()
        res.json({
            message: "Deleted Restaurant"
        })
    } catch (err) {
        res.status(500).json({
            message: err.message
        })
    }
})


async function getRestaurant(req, res, next) {

    let restaurant
    try {
        restaurant = await Restaurant.findById(req.params.id)
        if (restaurant == null) {
            return res.status(404).json({
                message: "cannot find Restaurant"
            })
        }
    } catch (err) {
        return res.status(500).jsong({
            message: err.message
        })
    }
    res.restaurant = restaurant
    next()
}

module.exports = router

请求:

# RESTURANTS

# Get All
GET http://localhost:3000/restaurants


###

# Get One
GET http://localhost:3000/restaurants/627e3012afe6e905cd550c9f

###


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

{
    "src": "https://ychef.files.bbci.co.uk/976x549/p04tx3m6.jpg",
    "title": "Joes Burgers",
    "description": "Good Fuggen Burgers",
    "menue": {
        "name": "Burger",
        "price": "R50",
        "description": "A good Fuggen burger"
    }
}

### 

#Delete One on ID

DELETE http://localhost:3000/restaurants/627e68802760c784cc5702c1


###

 #Update One 

PATCH http://localhost:3000/restaurants/627e68f62760c784cc5702c5
Content-Type: application/json

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

我对您的问题的理解是,您分别为餐厅和菜单使用了两个单独的集合。如果你想在菜单集合中推送数据,你将不得不编写一个单独的查询并在菜单集合中添加餐厅的 id 只是为了让你知道哪个餐厅有这个菜单。

另一个选项是您可以在餐厅集合中添加一个对象数组并将其命名为菜单,然后将数据推送到其中。

const restaurantSchema = new mongoose.Schema({
src: {
    type: String,
    required: true

},
title: {
    type: String,
    required: true
},
description: {
    type: String,
    required: true

},
menue: {
    type: Array,
    required: true
}})

那会是一个更简单的选择...