这是我的架构
我正在尝试将答案数组添加到答案数组中。如果有人回答了问题,是否有人想回答给定的答案
const mongoose = require("mongoose");
const { ObjectId } = mongoose.Schema;
const questionSchema = new mongoose.Schema(
{
postedBy: {
type: ObjectId,
required: true,
ref: "User",
},
question: {
type: String,
required: true,
},
photo: {
data: String,
required: false,
},
answers: [
{
userId: { type: ObjectId, ref: "User" },
answerType: {
data: String,
required: false,
},
answer: String,
replies: [
{
userId: { type: ObjectId, ref: "User" },
reply: String,
replyType: {
data: String,
required: false,
},
},
],
},
],
questionType: {
data: String,
required: false,
},
createdAt: {
type: Date,
required: true,
default: Date.now,
},
},
{ timeStamps: true }
);
module.exports = mongoose.model("Question", questionSchema);
这是我的Controller方法
exports.postReply = (req, res) => {
const reply = req.body.reply || "";
const userId = req.user._id || "";
const answerId = req.body.answerId || "";
Question.findByIdAndUpdate(
{ _id: answerId },
({ $push: { answers: { answer: { replies: { reply, userId } } } } },
{ new: true }),
(err, newReply) => {
if (err) {
res.status(400).json({
error: errorHandler(err),
});
} else {
res.json({
msg: "Reply posted successfully",
newReply,
});
}
}
);
};
我觉得我在findOneAndUpdate方法上出错了。我在控制台上没有收到任何错误,但newReply变为null。任何帮助将不胜感激。
答案 0 :(得分:0)
我建议您在将文档添加到数组时使用$ addToSet而不是$ push运算符。 (请参阅:https://docs.mongodb.com/manual/reference/operator/update/addToSet/)。 如果要向数组中添加多个文档,请同时参考$ each运算符和$ addToSet。
因此您的编码看起来可以与此类似(注意:变量“ yourDocument”是您要添加的文档):
Question.findByIdAndUpdate(
{ _id: answerId },
{ $addToSet: { answers: yourDocument } },
{ new: true },
(err, newReply) => {
if (err) {
res.status(400).json({
error: errorHandler(err),
});
} else {
res.json({
msg: "Reply posted successfully",
newReply,
});
}
}
);
};
答案 1 :(得分:0)
问题显然是周围的括号
({ $push: { answers: { answer: { replies: { reply, userId } } } } }, { new: true })
执行console.log( ({a:1}, {b:2}) );
将会记录{b: 2}
,这意味着您正在执行
Question.findByIdAndUpdate( { _id: answerId }, { new: true }, (err, newReply) => {
因此删除括号,您应该会好
Question.findByIdAndUpdate(
{ _id: answerId },
{ $push: { answers: { answer: { replies: { reply, userId } } } } },
{ new: true },
(err, newReply) => {
if (err) {
res.status(400).json({
error: errorHandler(err),
});
} else {
res.json({
msg: "Reply posted successfully",
newReply,
});
}
}
);