簡體   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