Buk Lau
Buk Lau

Reputation: 1630

get data into schema by id in mongoose

i have two schema i would like to get some info from another schema for example (firstName, lastName) from the userSchema by id that i would provide when adding new comment on the CommentsSchema

const CommentsSchema = new mongoose.Schema({
  userId: {
    type: String,
    required: true
  },
  commentText: {
    type: String,
    required: true
  },
  time: {
    type: Date,
    default: Date.now
  }
});
const UserSchema = new mongoose.Schema({
  userName: {
    type: String,
    required: true
  },
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  }
});

Upvotes: 0

Views: 36

Answers (1)

SuleymanSah
SuleymanSah

Reputation: 17888

You can use mongoose populate to get data from a referenced collection.

First you need to change comments schema to set up a reference to the User model. You may need to change ref value, if you used a different user model name when you applied mongoose.model("User", UserSchema).

const CommentsSchema = new mongoose.Schema({
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
    required: true
  },
  commentText: {
    type: String,
    required: true
  },
  time: {
    type: Date,
    default: Date.now
  }
});

Let's say you have this user in users collection:

{
    "_id": "5e312d5cab2e5028b8865be3",
    "userName": "Mongoose",
    "firstName": "Buk",
    "lastName": "Lau",
    "__v": 0
}

And this comment from this user:

{
    "_id": "5e312d9cab2e5028b8865be4",
    "userId": "5e312d5cab2e5028b8865be3",
    "commentText": "this is a comment",
    "time": "2020-01-29T07:00:44.126Z",
    "__v": 0
}

Now you can access the user info from comment like this:

router.get("/comments/:id", async (req, res) => {
  const result = await Comment.findById(req.params.id).populate("userId");
  res.send(result);
});

The result will be like this:

{
    "_id": "5e312d9cab2e5028b8865be4",
    "userId": {
        "_id": "5e312d5cab2e5028b8865be3",
        "userName": "Mongoose",
        "firstName": "Buk",
        "lastName": "Lau",
        "__v": 0
    },
    "commentText": "this is a comment",
    "time": "2020-01-29T07:00:44.126Z",
    "__v": 0
}

Upvotes: 1

Related Questions