在打字稿中使用猫鼬填充查询

Posted

技术标签:

【中文标题】在打字稿中使用猫鼬填充查询【英文标题】:Populate a query with mongoose in typescript 【发布时间】:2019-04-06 04:30:25 【问题描述】:

我在使用打字稿填充我的用户模型时遇到问题。我有一个用户方案的属性,它是对他的个人资料的引用。要使用 typescript 实现 mongoose,除了模式之外,我还必须定义一个 tpo / 接口。我的问题是我不知道必须为配置文件属性分配什么类型。因为如果我在不填充的情况下运行查询,它将是一个“ObjectId”,但如果我填充它将包含整个配置文件文档。

export type UserModel = mongoose.Document & 
  name: string;
  username: string; 
  email: string;
  password: string; 
  profile: Schema.Types.ObjectId; // If I leave this property with this type, in case I populate a typescript query it would give me an error. 
;


export const UserSchema = new Schema(
  name: 
    type: String,
    required: true
  ,
  username: 
    type: String,
    required: true,
    unique: true
  ,
  email: 
    type: String,
    unique: true,
    required: true
  ,

  password: 
    type: String,
    required: true
  ,
  profile: 
    type: Schema.Types.ObjectId,
    ref: "Profile"
  
);

export default model<UserModel>("User", UserSchema);

【问题讨论】:

问题到底是什么?如何在以后的代码中查看代码帮助中的“填充”属性?请注意,“打字稿”不是“运行时检查”。所以这真的不是关于“模型”定义,而是更多关于试图访问结构的代码。如果这是您真正想要的,请参阅How to define model in combination with using mongoose populate?。 @Neil Lunn 非常感谢,这正是我想要的。现在我想我需要消除这个问题,以免留下无用的重复 【参考方案1】:

我的问题是我不知道我必须为 个人资料属性。

您将需要定义 2 种类型/接口。

export default model<UserModel>("User", UserSchema);

此导出必须使用不同的界面,您可以在其中填充“配置文件”文档。

对于架构本身,您可以将其保留为 objectID 类型。

【讨论】:

【参考方案2】:

尝试将填充设置为指向模型,这应该可以解决问题

 User.find().populate(["path":"profile", "model":"Profile" ])

【讨论】:

非常感谢@Rodrigo Baute,但它对我不起作用。 Vscode 提供给我的方法很少(我相信是 ObjectId)

以上是关于在打字稿中使用猫鼬填充查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中的猫鼬userschema.methods中使用“this”

尝试在打字稿中使用猫鼬和 bcrypt 比较密码

在带有 loadClass 的打字稿中使用 es6 类和猫鼬

用打字稿中的子文档描述猫鼬模型

如何在打字稿中访问嵌套条件类型

与填充一起使用时,猫鼬查询性能低下