网站搜索

javascript - 在 Node/MongoDb 中创建 Schema


所以,我刚开始学习 Node/MongoDB 和 TypeScript,我在为这个嵌套的 JSON 数据库创建 Schema 时有点卡住了。我已经开始了一些工作,我想知道我是否走在正确的道路上。所以如果有人能帮助我,那将非常棒。提前感谢

数据

[{
   "a_class":[
   {    
    "brand":"A-class",
    "id":"1",
    "year":"2015"
    "price":"12665"
    ...
    "engine_spec":{
     ...
     }
     ...
      }]

}
]

接口

import { Document } from 'mongoose';
export default interface ICars extends Document {
   a_class: BrandList[],
}


interface BrandList {
 brand: string;
 id:number;
 year:number;
 main_image: string;
 price:number;
 transmission:string;
 fuel_type:string;
 seating_capacity:number;
 engine:number;
 engine_specs:Specs;
 volume_weights:Volume;
 performance: Performance
 images_interior: Interior
 images_exterior: Exterior
}

interface Specs {
    power:number;
    power_per_litre:number;
    torque:number;
    fuel_system:number
}

interface Volume {
    max_weights:number;
    fuel_tank:number
}


interface Performance {
    acceleration:number;
    maximum_speed:number;
    fuel_urban:number;
    fuel_extra_urban:number
    fuel_combined:number
}

interface Interior {
    image_one:string;
    image_two:string;
    image_three:string;
    image_four:string;
}

interface Exterior {
    image_one:string;
    image_two:string;
    image_three:string;
    image_four:string;
}

模式

import mongoose, { Schema } from 'mongoose';

import ICars from '../interfaces/cars'

const CarsSchema: Schema = new Schema({

  a_class:Array,
  brand: String,
  year:Number,
})

export default mongoose.model<ICars>('Cars', CarsSchema);

获取路由,所以当我尝试通过 Postman 获取所有数据时,它不允许我访问,它显示该路由未找到 404。我已经将它导入到 server.js 中 import carsRouter from './routes/cars'; router.use('./cars', carsRouter),我不知道错误可能出在哪里

import express from 'express'
import Cars from '../models/cars'

const router = express();


router.get('/cars', (req:any, res:any )=>{
    Cars.find()
    .then(car=> res.json(car))
    .catch(err => res.status(400).json(`Error: ${err}`))
})

 export=router

答案#1

根据 Mongoose 文档,我们应该避免扩展 Mongoose 的 Document。

这种方法可行,但我们建议你的文档接口不要继承 Document。使用 extends Document 会使 Mongoose 难以推断查询过滤器、精简文档和其他情况下存在哪些属性。

我们建议您的文档接口包含在您的模式中定义的属性,并与您的 MongoDB 文档的外观保持一致。虽然您可以向文档接口添加实例方法,但我们不建议这样做。

欲了解更多信息,请参考: https://mongoosejs.com/docs/typescript.html#using-extends-document

看起来我们可以使用 mongoose 子文档来满足这个需求。关于子文档的更多信息,请参考:https://mongoosejs.com/docs/subdocs.html#subdocuments

所以在这种情况下,我们可以稍微改写一下你的代码:

接口:

export default interface ICars {
   a_class: BrandList[],
}

// The other interfaces can be kept

模式 :

const Exterior = new Schema({
   // own fields
});


const Interior = new Schema({
   // own fields
});

const Performance = new Schema({
   // own fields
});

const Volume = new Schema({
   // own fields
});

const SpecsSchema = new Schema({
   // own fields
});

const BrandListSchema = new Schema({
  // other fields
  engine_specs: [SpecsSchema],
  volume_weights: [VolumeSchema],
  performance: [PerformanceSchema],
  images_interior: [InteriorSchema],
  images_exterior: [ExteriorSchema],
});

const CarsSchema: Schema = new Schema({
  a_class: [BrandListSchema],
});