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

时间:2018-03-12 04:05:23

标签: node.js mongodb typescript mongoose mongoose-models

我正在使用本文所述的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.

在使用上面链接文章中概述的mongoose模型时处理Subdocuments是否正确?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用此软件包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' } }); 

答案 1 :(得分:-2)

这似乎是您尝试使用typeScript创建架构,然后想要使用它来存储数据到Collection。 我已经这样做了,我发布了这个,因为你可以找到任何使用它的参考文献。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var blogSchema = new Schema({
  title:  String,
  author: String,
  body:   String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
     votes: Number,
     favs:  Number
  }
});

module.exports = mongoose.model('Blog', blogSchema);

在此之后,我有一个Schema,它被输入并且只接受匹配类型的数据。 所以我可以使用它来使用mongoose将数据存储到MongoDB中。

 var blog = new Blog({
    'title': "Started",
    "author": "Amit Mundra",
    "body": "Got started with it",
    "comments": {
        "body": "First Comment",
        'time': Math.floor(Date.now() / 1000)            
    },
    "date": {"type":Math.floor(Date.now() / 1000),"default":Math.floor(Date.now() / 1000)},
    "hidden": "false",
    "meta": {
        "votes": 2,
        "favs":  2
      }    
});

现在可以使用blog.save()方法将数据库实例用于存储数据。如果我们提供的数据不符合模式,那么它将显示有关相同的错误。