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
}})
那会是一个更简单的选择...
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
}})
那会是一个更简单的选择...