我有2个模式,如图所示
const gameSchema = new mongoose.Schema({
title: String,
rating: { type: Number, min: 0, max: 100 },
genres: { type: Array, ref: 'Genres' }
})
const GenreSchema = new mongoose.Schema({
id: { type: Number },
name: String,
description: String
})
mongoose.model('Games', gameSchema)
mongoose.model('Genres', GenreSchema)
现在,一个端点/api/games
返回游戏的结果数组,其中genres
属性包含ID数组,例如。 "genres": [4, 7, 19]
如何在没有任何genres
的情况下填充ObjectId
?我尝试使用普通的ref方法,但是它说
{"stringValue":"\"4\"","kind":"ObjectId","value":4,"path":"_id","reason":{},"message":"Cast to ObjectId failed for value \"4\" at path \"_id\" for model \"Genres\"","name":"CastError"}
我想将其指向id
,而不是_id
您可以使用Virtuals
的概念。这是怎么回事:
如下修改您的架构文件:
//---------------------------------------------------
const gameSchema = new mongoose.Schema({
title: String,
rating: { type: Number, min: 0, max: 100 },
genres: [Number],//here you have an array of id of type Number as yours, no ref
});
const GenreSchema = new mongoose.Schema({
id: { type: Number },
name: String,
description: String,
});
gameSchema.virtual("games", {
ref: "Genres",//this is the model to populate
localField: "id",//the field used to make the populate, it is the field that must match on the aimed Genres model <- here is the trick you want!!!
foreignField: "genres",//the field to populate on Games model
justOne: false,
});
gameSchema.set("toObject", { virtuals: true });//if you are planning to use say console.log
gameSchema.set("toJSON", { virtuals: true });//if you are planning to use say res.json
mongoose.model("Games", gameSchema);
mongoose.model("Genres", GenreSchema);
//-------------------------------------------------
在您要填充的文件上,将其放在声明部分:
//-----------------------------------------------------
const Games = mongoose.model("Games", gameSchema);
//---------------------------------------------------
最后但并非最不重要的,要填充的位置:
//----------------------------------------------
Games.find({})
.populate("games")
.exec(function (error, games) {
console.log(games);
});
//---------------------------------------------
我已经针对已解决的问题测试了该解决方案,请对其进行修改以满足您的需求,请告诉我它是否可以解决您的问题;如果没有,我们可以一起弄清楚如何使我的解决方案适合您的需求。
一些初始参考文献