0

I have a mongoDb model defined as follows:-

var mongoose = require("mongoose");

const postModel = new mongoose.Schema({
    postId: {
        type: String,
        unique: true,
        required: true
    },
    authorId: {
        type: String,
        required: true
    },
    post: {
        authorHandle: {
            type: String,
            required: true
        },
        heading: {
            type: String,
            required: true
        },
        message: {
            type: String,
            required: true
        },
        creationDate: {
            type: Date,
            required: true
        },
        image: { type: Array }, 
        video: { type: Array },
        comments: {
            type: Array
        }
    }
});

module.exports = mongoose.model("postModel", postModel);

Now I have a sample value of a document of the above model, suppose:-

postId: "aaa",
authorId: "bbb",
post: {
  authorHandle: "someone#123",
  heading: "hello",
  message: "post 1",
  creationDate: "some creation date string(please ignore this is irrelevant to my question)",
  image: [],
  video: [],
  comments: [
   { commentId: "1", message: "Something", createdAt: sometime },
   { commentId: "2", message: "Something else", createdAt: sometime2 },
   { commentId: "3", message: "Something other", createdAt: sometime3 },
  ]
}

Now say the user wants to update the comment with commentId 2 of this post with postId "aaa". My question is that what is the best way to use the findOneAndUpdate() method to solve this problem?

const PostModel = require("./models/PostModel"); //just importing the model that is defined above
//the below is happening inside a request handler in Node + Express
PostModel.findOneAndUpdate(
  //what to do here
)

What I have tried is pulling out that whole object and replacing it with a new object with the new message. But that doesnt seem like a very efficient way. Any and all help is greatly appreciated!

1 Answer 1

1

You should write:

const updatedPost = await PostModel.findOneAndUpdate(
  { postId: 'aaa', 'post.comments.commentId': 2 },
  { 'post.comments.$.message': 'Updated message'},
  { new: true }
)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.