Crud operations mongodb , nodejs , express , mongoose


import mongoose from "mongoose";
const productSchema = mongoose.Schema(
{
name: {
type: String,
required: true
},
category: {
type: mongoose.Schema.Types.ObjectId,
ref: "Category",
required: true
}
},
{ timestamps: true }
);
const Product = mongoose.model("Product", productSchema);
export default Product;

import mongoose from "mongoose";
const categorySchema = mongoose.Schema(
{
name: {
type: String,
required: true,
unique: true
}
},
{ timestamps: true }
);
const Category = mongoose.model("Category", categorySchema);
export default Category;

//创建产品

const createProduct = asyncHandler(async (req, res) => {
const { name } = req.body;
const product = new Product({
name,
category: req.category._id
});
if (product) {
const createdProduct = await product.save();
res.status(201).json(createdProduct);
} else {
res.status(404).json({ message: "Product already exists" });
}
});

//更新产品

const updateProduct = asyncHandler(async (req, res) => {
const { name, categoryName } = req.body;
const product = await Product.findById(req.params.id);
if (product) {
product.name = name;
product.categoryName = categoryName;
const updatedProduct = await product.save();
res.json(updatedProduct);
} else {
res.status(404);
throw new Error("Product not found");
}
});

我无法将类别数据获取到其显示的产品数据中BSON错误,我希望数据看起来是这样的。

> products = [ {
> _id : "", name: "", category : {   _id:"",   name:""  } } ]

我想用这些数据创建api-产品名称&类别名称,其自动为产品&类别仅包括产品&类别名称

我会尽力帮助你,正如我从你的帖子中所理解的那样。首先,在产品模式中,您只保存类别ID,而没有提及产品类别名称字段。您需要将其添加到您的productSchema中,如下所示。

const productSchema = mongoose.Schema(
{
name: {
type: String,
required: true
},
categoryId: {
type: mongoose.Schema.Types.ObjectId,
ref: "Category",
required: true
},
categoryName:{
type:String
} 
},
{ timestamps: true }
);
const Product = mongoose.model("Product", productSchema);

现在您要做的是,由于您有categoryId,因此在保存之前必须向Category集合激发一个查询,如下所示。

// Create Products
const createProduct = asyncHandler(async (req, res) => {
const { name, categoryId } = req.body;
//Querying Category collection
const category = await Category.find({_id:categoryId})
//Creating Product Object
const product = new Product({
name,
categoryId,
categoryName:category.name
});
if (product) {
const createdProduct = await product.save();
res.status(201).json(createdProduct);
} else {
res.status(404).json({ message: "Product already exists" });
}
});

现在,您还可以将名称保存在产品集合中。通过更新处理程序,您不应该更新产品文档中的类别名称,最佳做法是使用req.body中的categoryId并查询到该名称的类别集合。如果要更改类别名称,请在类别集合中更改它,并使用该特定对象Id在产品集合中更新它。希望这对你有帮助。感谢

最新更新