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],
});
