繁体   English   中英

如何将 mongoose 中的鉴别器连接到我的父文档? 尝试导入数据时出错

[英]How do I connect my discriminators in mongoose to my parent document? Getting errors when trying to import data

我正在制作一个电子商务应用程序,我正在尝试创建 1 个文档“产品”,其中包含“评论”和“面料”的架构。 每个产品都有不止一种面料,每种面料都有自己的一套尺寸,具体取决于产品的类型(配件、加码、标准等)。

我正在尝试使用 mongoose 鉴别器使这些嵌套在产品 model 的“织物”数组中。

尝试导入数据时出现错误,我一直在更改设置以尝试使其工作无济于事。 我已经阅读了鉴别器文档以及关于 mongoose 鉴别器的大约 30 个不同的帖子。

我在此设置中遇到的错误是“TypeError: Product.path is not a function”

这就像我尝试连接鉴别器的第 15 种不同方式,所有这些都基于人们似乎认为对他们有用的其他帖子。

任何帮助将不胜感激!

我目前的代码是:


const reviewSchema = mongoose.Schema(
  {
    name: { type: String, required: true },
    rating: { type: String, required: true },
    comment: { type: String, required: true },
  },
  {
    timestamps: true,
  }
)

const fabricSchema = new mongoose.Schema({
  fabricId: { type: String, required: true },
  fabricImage: { type: String, required: true },
})

const Product = mongoose.model(
  'Product',
  new mongoose.Schema({
    user: {
      type: mongoose.Schema.Types.ObjectId,
      required: true,
      ref: 'User',
    },
    sku: {
      type: String,
      required: true,
    },
    name: {
      type: String,
      required: true,
    },
    image: {
      type: String,
      required: true,
    },
    category: {
      type: String,
      required: true,
    },
    fabricType: {
      type: String,
      required: true,
    },
    details: {
      type: String,
      required: true,
    },
    reviews: [reviewSchema],
    rating: {
      type: Number,
      required: true,
      default: 0,
    },
    numReviews: {
      type: Number,
      required: true,
      default: 0,
    },
    price: {
      type: Number,
      required: true,
    },
    wholesalePrice: {
      type: Number,
      required: true,
    },
    sale: {
      type: Object,
      required: true,

      onSale: {
        type: Boolean,
        required: true,
        default: false,
      },
      salePrice: { type: Number },
    },
    fabrics: [fabricSchema],
  })
)

const productType = Product.path('fabrics')

const standardProduct = productType.discriminator(
  'standardProduct',
  new mongoose.Schema({
    availableSizes: {
      xs: { type: Number, required: true, default: 0 },
      s: { type: Number, required: true, default: 0 },
      m: { type: Number, required: true, default: 0 },
      l: { type: Number, required: true, default: 0 },
      xl: { type: Number, required: true, default: 0 },
    },
  })
)

const plusSizeProduct = productType.discriminator(
  'plusSizeProduct',
  new mongoose.Schema({
    availableSizes: {
      oneX: { type: Number, required: true, default: 0 },
      twoX: { type: Number, required: true, default: 0 },
    },
  })
)

const accessoryProduct = productType.discriminator(
  'accessoryProduct',
  new mongoose.Schema({
    availableSizes: {
      os: { type: Number, required: true, default: 0 },
    },
  })
)

export { Product, standardProduct, plusSizeProduct, accessoryProduct }

在玩了更多(更多)之后,我解决了自己的问题。 我没有将 model 和模式/鉴别器和模式一起调用,而是将它们分开(尽管这与其他人在其他网站/帖子上的“修复”似乎无关紧要)。 我也做了一些重组,只是为了我自己对数据的敏感性。

我还将 { discriminatorKey: 'kind' } 移动到嵌套在 fabricSchema 中(可能有帮助)。

不过,似乎解决了这个问题的是,在分离之后,我连接了 productSchema.path('fabrics')。

我正确使用导入数据的最终版本是:


/*const options = { discriminatorKey: 'kind', collection: 'products' }*/

const reviewSchema = mongoose.Schema(
  {
    name: { type: String, required: true },
    rating: { type: String, required: true },
    comment: { type: String, required: true },
  },
  {
    timestamps: true,
  }
)

const fabricSchema = new mongoose.Schema(
  {
    fabricId: { type: String, required: true },
    fabricImage: { type: String },
    itemImage: {
      type: String,
    },
    availableSizes: {
      type: Object,
      required: true,
    },
  },
  { discriminatorKey: 'kind' }
)

const productSchema = new mongoose.Schema({
  user: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: 'User',
  },
  sku: {
    type: String,
    required: true,
  },
  name: {
    type: String,
    required: true,
  },
  image: {
    type: String,
    required: true,
  },
  category: {
    type: String,
    required: true,
  },
  fabricType: {
    type: String,
    required: true,
  },
  details: {
    type: String,
    required: true,
  },
  price: {
    type: Number,
    required: true,
  },
  wholesalePrice: {
    type: Number,
    required: true,
  },
  onSale: {
    type: Boolean,
    required: true,
    default: false,
  },
  salePrice: {
    type: Number,
  },
  reviews: [reviewSchema],
  rating: {
    type: Number,
    required: true,
    default: 0,
  },
  numReviews: {
    type: Number,
    required: true,
    default: 0,
  },
  fabrics: [fabricSchema],
})

const fabricSizes = productSchema.path('fabrics')

const Product = mongoose.model('Product', productSchema)

// sub schemas

const standardSchema = new mongoose.Schema({
  availableSizes: {
    xs: { type: Number, required: true, default: 0 },
    s: { type: Number, required: true, default: 0 },
    m: { type: Number, required: true, default: 0 },
    l: { type: Number, required: true, default: 0 },
    xl: { type: Number, required: true, default: 0 },
  },
})

const plusSizeSchema = new mongoose.Schema({
  availableSizes: {
    oneX: { type: Number, required: true, default: 0 },
    twoX: { type: Number, required: true, default: 0 },
  },
})

const accessorySchema = new mongoose.Schema({
  availableSizes: {
    os: { type: Number, required: true, default: 0 },
  },
})

// discriminators

const standardProduct = fabricSizes.discriminator(
  'standardProduct',
  standardSchema
)

const plusSizeProduct = fabricSizes.discriminator(
  'plusSizeProduct',
  plusSizeSchema
)

const accessoryProduct = fabricSizes.discriminator(
  'accessoryProduct',
  accessorySchema
)

export { Product, standardProduct, plusSizeProduct, accessoryProduct }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM