skip to Main Content

I am building an app to make simple surveys, and I am using mongoose. I setup a single entity to define surveys, and this entity includes questions and answers

const mongoose = require("mongoose");
const {User} = require("./User");

const SurveySchema = mongoose.Schema({
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    title: {
        type: String,
        minLength: 5,
        maxlength: 100,
        required: true
    },
    // other fields///
    questions: [{
        question: {
            type: String,
            minLength: 10,
            maxlength: 200,
            required: true
        },
        answers: [{
            type: String,
            minLength: 10,
            maxlength: 100,
            required: false
        }],
    }],
}, {timestamps: true} );

module.exports.Survey = mongoose.models.Survey || mongoose.model('Survey', SurveySchema);

when I need to add a question to a survey, I am doing this (answers is just an array of strings)

let survey = await surveyManager.getSurvey(surveyId);
let newQuestion = {
  question: question,
  answers: answers
};
survey.questions.push(newQuestion);
await survey.save();
return survey;

and this is my new question as seen quering mongodb from the command line

"questions" : [
  {
    "question" : "this is a question?",
    "answers" : [
          "answer number 1",
          "answer number 2",
          "answer number 3"
    ],
    "_id" : ObjectId("63a89d2e101149d7958e0f78")
  }
],

as you can see, an object id is assigned to each question, which is fine. So my question is, how can I assign an object id to each answer as well? I’d need it to refer to then form another collection.

2

Answers


  1. I suppose you could declare your answers like so and this will automatically assign an _id to them:

    const SurveySchema = mongoose.Schema({
     ...
     ...
        questions: [{
            question: {
                type: String,
                minLength: 10,
                maxlength: 200,
                required: true
            },
            answers: [{
                type: new mongoose.Schema({
                    answer_text: {
                        type: String,
                        minLength: 10,
                        maxlength: 100,
                        required: false
                    }
                })
            }]
        }],
    });
    
    Login or Signup to reply.
  2. You can just set the answers to be an object, and Mongoose will add a new _id to each item in the array:

    questions: [{
      question: {
        type: String,
        minLength: 10,
        maxlength: 200,
        required: true
      },
      answers: [{
        answer: {
          type: String,
          minLength: 10,
          maxlength: 100,
          required: false
        }
      }],
    }],
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search