首页 > 解决方案 > 猫鼬填充自定义对象数组

问题描述

在用户模型中,我有一个自定义对象数组followedPlaylists,其中包含两个属性(播放列表:播放列表的ID,公共:确定它是否是公共的)如下所示

const userSchema = new mongoose.Schema({

   ..... other attributes

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

})

我想在 followPlaylists.playlist 上填充,所以响应类似于

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

我希望我的问题足够清楚,并在此先感谢。

标签: node.jsmongodbmongoosemongoose-schemamongoose-populate

解决方案


在这里,我假设您的播放列表运行良好。即,它具有元素并且已经过独立测试。因此,给定架构:

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
  }]

})

无论您想打印什么,只需制作以下内容:

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

例子

例子是掌握概念的最佳方式。你可以玩这个例子:

//------------------------------------------------------------------
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");
});

推荐阅读