我想在猫鼬的数组子文档中传递数组对象

时间:2020-09-16 09:30:12

标签: node.js mongoose

这是我的架构

我正在尝试将答案数组添加到答案数组中。如果有人回答了问题,是否有人想回答给定的答案

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。任何帮助将不胜感激。

2 个答案:

答案 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,
        });
      }
    }
  );