当前位置: 首页 > 知识库问答 >
问题:

使用typescript创建mongoose模型-子文档

丁安宜
2023-03-14

我正在使用本文概述的typescript实现mongoose模型:https://github.com/Appsilon/styleguide/wiki/mongoose-typescript-models 我也不确定在处理子文档数组时这是如何翻译的。假设我有以下模型和模式定义:

interface IPet {  
    name: {type: mongoose.Types.String, required: true},   
    type: {type: mongoose.Types.String, required: true}   
}

export = IPet


interface IUser {   
    email: string;    
    password: string;   
    displayName: string;   
    pets: mongoose.Types.DocumentArray<IPetModel>   
};

export = IUser;


import mongoose = require("mongoose");  
import IUser = require("../../shared/Users/IUser");   
interface IUserModel extends IUser, mongoose.Document { }

import mongoose = require("mongoose");   
import IPet = require("../../shared/Pets/IPet");   
interface IPetModel extends IPet, Subdocument { }

将向user.pet子文档添加新宠物的代码:

addNewPet = (userId: string, newPet: IPet){
    var _user = mongoose.model<IUserModel>("User", userSchema);
    let userModel: IUserModel = await this._user.findById(userId);
    let pet: IPetModel = userModel.pets.create(newPet);
    let savedUser: IUser = await pet.save();
}

在查看链接之后,这似乎是处理子文档所必需的理想方法。但是,此场景似乎会引发CasterConstructor异常:

TypeError: Cannot read property 'casterConstructor' of undefined at Array.create.

当使用猫鼬模型时,它是处理子文档的正确方法吗?

共有1个答案

仉洲
2023-03-14

你可以试试这个套餐https://www.npmjs.com/package/mongoose-ts-ua

@setSchema()
class User1 extends User {
    @prop()
    name?: string;

    @setMethod
    method1() {
        console.log('method1, user1');
    }
}

@setSchema()
class User2 extends User {
    @prop({ required: true })
    name?: string;

    @prop()
    child: User1;
}

export const User2Model = getModelForClass<User2, typeof User2>(User2);

用法

let u2 = new User2Model({ child: { name: 'u1' } }); 
 类似资料:
  • 我是新来的rails和建立一个应用程序,从外部网站获取json数据,并将其保存在数据库中。json在User下有以下字段: {“id”:“姓名”:“用户名”:“电子邮件”:“地址”:{“街道”:“套房”:“城市”:“邮编”:“}”电话::“网站”:“}”, 我知道如何创建一个用户模型与名称,用户名和电子邮件。但是我如何添加具有多个子属性的地址。我没有看到“数组”作为创建模型的选项。提前谢谢你。

  • 嗨,我是TypeScript新手,我来自C#和JavaScript背景。我正在尝试创建一种方法,使我能够创建类似于C#的类模型。 以下是我尝试过的: 我希望这会生成一个JavaScript模型,公开声明的属性,但这只生成一个函数,没有声明属性。 在查看文档之后,我注意到为了公开属性,我必须添加一个构造函数并从中初始化属性。虽然这可能会起作用,但在每个模型可能有20个或更多属性的情况下,这并没有帮助

  • 我很好奇在我的主模式中使用子文档和更深层文档的利弊: 或者 我目前到处都在使用subdocs,但我主要想知道我可能遇到的性能或查询问题。

  • 问题内容: 我正在尝试在MongoDB中更新实例化模型(“地方”-我知道它可以在其他路线中使用),并且花了一段时间尝试正确地做到这一点。我还试图重定向回查看“位置”的页面,以查看更新的属性。 节点v0.4.0,Express v1.0.7,Mongoose 1.10.0 架构: 控制器/路线: }); 我尝试了多种方法,但似乎无法理解。 另外,我不是如何声明三个{name,capital和cont

  • 我有一份这样的文件: 我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。 更新后的文档: 我的选择查询如下: 我怎样才能做到这一点?

  • 问题内容: 如果您有子文档数组,Mongoose会自动为每个数组创建ID。例: 有没有办法告诉猫鼬不要为数组内的对象创建ID? 问题答案: 很简单,您可以在以下子模式中定义它: