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

斯瓦普尼尔·索尼

我有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) {
   //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. 用非id的字段填充猫鼬模型

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章