0

In the user model, I have an array of custom objects followedPlaylists which contains two attributes ( playlist: the id of the playlist, public: to determine whether it is public or not) as shown below

const userSchema = new mongoose.Schema({

   ..... other attributes

  followedPlaylists: [{
    playlist: {
      type: mongoose.Schema.ObjectId,
      ref: 'Playlist',
      unique: true
    },
    public: Boolean
  }]

})

I want to populate on followedPlaylists.playlist so the response would be something like

[{
    playlist: * the actual playlist object *,
    public: true
}]

I hope my question is clear enough and thanks in advance.

1 Answer 1

1

Here I am assuming that your Playlist is working just fine. i.e., it has elements and has been tested independently. So, given the schema:

Const Playlist = require (./Playlist)//here you have to provide the path to the Playlist model or use mongoose.model (“Playlist”) to bring it in
………….

const userSchema = new mongoose.Schema({

   ..... other attributes

  followedPlaylists: [{
    playlist: {
      type: mongoose.Schema.ObjectId,
      ref: 'Playlist',
      unique: true
    },
    public: Boolean
  }]

})

On whatever you want to print it, just make something like:

Const user = mongoose.model (“User”);//or use require, what fits best your applications
……
Console.log(user.find().populate(“Playlist”))//here is the trick, you ask to populate the Playlist

Example

Examples are the best way to grasp a concept. You can play around with this example:

//------------------------------------------------------------------
const mongoose = require("mongoose");

const { model, Schema } = require("mongoose");

var dbURI = "mongodb://localhost/mongoose-sample";

const app = require("express")();

mongoose
  .connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(console.log(`connected to ${dbURI}`));
//----------------------------------------------------------------------

const departmentSchema = new Schema({ name: String, location: String });
const Department = model("department", departmentSchema);

const EmployeeSchema = new Schema({
  firstName: String,
  lastName: String,
  department: { type: mongoose.Types.ObjectId, ref: "department" }
});
const Employee = model("employee", EmployeeSchema);

app.use("/", async (req, res) => {
  //   await Department.remove({});

  // await Department.create({
  //   name: "Fiocruz",
  //   location: "Presidência"
  // }).then(console.log(`we are good`));

  // await Department.create({
  //   name: "IASI",
  //   location: "Roma"
  // }).then(console.log(`we are good`));

  // await Employee.create({
  //   firstName: "Jorge",
  //   lastName: "Pires",
  //   department: await Department.findOne({ name: "Fiocruz" })
  // });

  // await Employee.create({
  //   firstName: "Marcelo",
  //   lastName: "Pires",
  //   department: await Department.findOne({ name: "IASI" })
  // });

  // Employee.findOne("")
  //   .populate("department", "name")
  //   .select("department")
  //   .then(result => {
  //     console.log(result);
  //   });

  await Employee.findOne({ _id: "5e6e28ec480a9d32fc78c46b" }, (err, result) => {
    console.log(result);
  })
    .populate("department", "name")
    .select("department");

  res.json({
    departments: await Department.find(),
    employees: await Employee.find(),
    employeesWithDep: await Employee.find().populate("department", "name"),
    justDepartment: await Employee.findOne({ _id: "5e6e28ec480a9d32fc78c46b" })
      .populate("department", "name")
      .select("department")
  });
});

app.listen(3000, () => {
  console.log("we are on port 3000");
});
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.