猫鼬填充在自定义对象的数组中



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

const userSchema = new mongoose.Schema({
..... other attributes
followedPlaylists: [{
playlist: {
type: mongoose.Schema.ObjectId,
ref: 'Playlist',
unique: true
},
public: Boolean
}]
})

我想在followedPlaylists.playlist上填充,这样响应就会像一样

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

我希望我的问题足够清楚,并提前表示感谢。

这里我假设您的播放列表运行良好。即它具有元件并且已经被独立地测试。因此,给定模式:

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

最新更新