Javascript 为什么虚拟填充不能在节点js和mongoose上工作?场景:产品和用户审查
我有评论和产品模型。如果用户对特定产品(id)进行评论,那么它将存储在评论模型数据库中,但我不喜欢将用户评论存储在产品模型数据库中。因此,我在产品模型中使用虚拟填充,而不是子引用。使用虚拟属性后,如果我们使用产品id查看详细信息,我们可以看到json格式的用户评论,但没有保存在数据库中。但问题是我的虚拟属性(在产品模型中)不起作用,因为当我以该产品id发送请求时,它没有以json格式显示对用户的评论,而该产品id已经由用户进行了评论(存储在评论模型数据库中)。这里有什么问题 用户对数据库中存储的产品(id)的审核 发送该产品id的请求,以查看使用虚拟属性的json格式的用户评论(但在json中未找到评论) 在产品模型中Javascript 为什么虚拟填充不能在节点js和mongoose上工作?场景:产品和用户审查,javascript,node.js,mongodb,mongodb-query,mongoose-populate,Javascript,Node.js,Mongodb,Mongodb Query,Mongoose Populate,我有评论和产品模型。如果用户对特定产品(id)进行评论,那么它将存储在评论模型数据库中,但我不喜欢将用户评论存储在产品模型数据库中。因此,我在产品模型中使用虚拟填充,而不是子引用。使用虚拟属性后,如果我们使用产品id查看详细信息,我们可以看到json格式的用户评论,但没有保存在数据库中。但问题是我的虚拟属性(在产品模型中)不起作用,因为当我以该产品id发送请求时,它没有以json格式显示对用户的评论,而该产品id已经由用户进行了评论(存储在评论模型数据库中)。这里有什么问题 用户对数据库中存储的
const productSchema = new Schema({
name: {
type: String,
required: true,
trim: true,
},
slug: {
type: String,
required: true,
unique: true,
},
price: {
type: String,
required: true,
},
quantity: {
type: Number,
required: true,
},
description: {
type: String,
required: true,
trim: true,
},
offer: {
type: Number,
},
discount: {
type: Number,
},
productPictures: [{
img: {
type: String,
},
}, ],
mainCategory: {
type: mongoose.Schema.Types.ObjectId,
ref: "category",
required: [true, "It is a required field"],
},
sub1Category: {
type: mongoose.Schema.Types.ObjectId,
ref: "category",
required: [true, "It is a required field"],
},
sub2Category: {
type: mongoose.Schema.Types.ObjectId,
ref: "category",
required: [true, "It is a required field"],
},
createdBy: {
type: mongoose.Schema.Types.ObjectId,
ref: "admin",
required: true,
},
vendor: {
type: mongoose.Schema.Types.ObjectId,
ref: "vendor",
},
createdAt: {
type: String,
default: moment().format("DD/MM/YYYY") + ";" + moment().format("hh:mm:ss"),
},
updatedAt: {
type: String,
default: moment().format("DD/MM/YYYY") + ";" + moment().format("hh:mm:ss"),
},
},
{
toJson: { virtuals: true },
toObject: { virtuals: true },
}
);
productSchema.virtual("reviews", {
ref: "review",
foreignField: "product",
localField: "_id",
// justOne: true
});
const Product = mongoose.model("product", productSchema);
module.exports = Product;
审查中的模式
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const moment = require("moment");
const reviewSchema = new Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "user",
required: [true, "Review must belong to user"],
},
product: {
type: mongoose.Schema.Types.ObjectId,
ref: "product",
required: [true, "Review must belong to the product"],
},
review: {
type: String,
required: [true, "Review cannot be empty"],
},
rating: {
type: Number,
min: 1,
max: 5,
},
createdAt: {
type: String,
default: moment().format("DD/MM/YYYY") + ";" + moment().format("hh:mm:ss"),
},
updateddAt: {
type: String,
default: moment().format("DD/MM/YYYY") + ";" + moment().format("hh:mm:ss"),
},
}, {
toJson: { virtuals: true },
toObject: { virtuals: true },
});
// pre middleware and populating user and product(we can also do populate in getAllReview in controller)
reviewSchema.pre(/^find/, function(next) {
// ^find here is we use regex and can able to find,findOne ...etc
this.populate({
path: "product",
select: " _id name",
}).populate({
path: "user",
select: " _id fullName",
});
next()
});
const Review = mongoose.model("review", reviewSchema);
module.exports = Review;
In Review.js
const Review = require("../../models/Review.Models")
exports.createReview = async(req, res) => {
const review = await Review.create(req.body)
return res.status(201).json({
status: true,
review
})
}
exports.getAllReviews = async(req, res) => {
try {
const reviews = await Review.find()
return res.status(200).json({
status: true,
totalReviews: reviews.length,
reviews
})
} catch (error) {
return res.status(400).json({
status: false,
error
})
}}
在Product.js中
const Product = require("../../models/Product.Models");
exports.getProductDetailsById = async(req, res) => {
try {
const { productId } = req.params;
// const { productId } = req.body;
if (productId) {
const products = await Product.findOne({ _id: productId })
.populate('reviews')
return res.status(200).json({
status: true,
products,
});
} else {
console.log("error display");
return res.status(400).json({
status: false,
error: "params required...",
});
}
} catch (error) {
return res.status(400).json({
status: false,
error: error,
});
}
try {
if (productId) {
const products = await Product.findOne({ _id: productId }).populate(
"reviews"
);
console.log(products);
if (products) {
return res.status(200).json({
status: true,
message: "Products is listed",
products,
reviw: products.reviews,
});
在Product.js中试试这个
const Product = require("../../models/Product.Models");
exports.getProductDetailsById = async(req, res) => {
try {
const { productId } = req.params;
// const { productId } = req.body;
if (productId) {
const products = await Product.findOne({ _id: productId })
.populate('reviews')
return res.status(200).json({
status: true,
products,
});
} else {
console.log("error display");
return res.status(400).json({
status: false,
error: "params required...",
});
}
} catch (error) {
return res.status(400).json({
status: false,
error: error,
});
}
try {
if (productId) {
const products = await Product.findOne({ _id: productId }).populate(
"reviews"
);
console.log(products);
if (products) {
return res.status(200).json({
status: true,
message: "Products is listed",
products,
reviw: products.reviews,
});
只需要添加响应发送
return res.status(200).json({
status: true,
message: "Products is listed",
products,
reviw: products.reviews,
});
在您的模式中,将
toJson:{virtuals:true}
-ie dotoJson:{virtuals:true}
中的json部分大写,它没有产生任何影响,下面的注释已经解决了我的问题。无论如何,感谢您在我测试它时,它工作得很好。。。但这没关系,因为你似乎已经解决了这个问题。谢谢,它真的解决了。另外,我忘了从产品模型中删除一个:true,因为这只会显示一个评论。