猫鼬:填充没有任何 ObjectId 的猫鼬



我有两个模式,如所示

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]

如何在没有任何ObjectId的情况下填充genres?我试过用正常的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) {
//with games you can use things like game.field1, it is actually an JSON object! Print out games and see the fieds for your self, select one and call it using the dot notation! 
console.log(games);
});
//---------------------------------------------

我已经在我做过的一个问题上测试了这个解决方案,只是根据您的需求进行了修改,请告诉我它是否适用于您;如果没有,我们可以一起找出如何适合我的解决方案来满足您的需求。

一些初始参考

  1. 使用字段填充猫鼬模型,该字段不是';t an id

最新更新