Для этого примера: набор данных файл books.json: [{"addr": "address1", "book": "book1", "rawPrice": "9.135027", ...

0
Yahya KACEM 14 Янв 2021 в 18:53

1 ответ

Лучший ответ

В вашей схеме есть проблема с вашим набором данных, и вы работаете с исключением в Mongoose 5+, где price становится путем Mixed.

Сначала проверьте, хотите ли вы вложенный путь или вложенные документы. Здесь вы как бы пытались получить и то, и другое. Если мы предположим, что вы хотите получить тот же результат, что и в prices (вложенные документы), тогда ваша схема будет выглядеть так.

const decimalField = {
  default: 0,
  required: true,
  type: Schema.Types.Decimal128,
  get: (v: Schema.Types.Decimal128) => v.toString(),
};

const priceSchema = new Schema({
  net: decimalField,
  gross: decimalField,
});

const booksScema = new Schema(
  {
    addr: String,
    book: String ,
    rawPrice: decimalField,
    price: priceSchema,
    prices: {
      type: priceSchema,
      validate: (v: any) => Array.isArray(v) && v.length > 0,
    },
  },
  {
    timestamps: true,
    versionKey: false,
    // useNestedStrict: true, https://mongoosejs.com/docs/guide.html#useNestedStrict
    // strict: 'throw',
  }
);

Или вместо этого вы можете использовать опцию typePojoToMixed: false следующим образом:

const decimalField = {
  default: 0,
  required: true,
  type: Schema.Types.Decimal128,
  get: (v: Schema.Types.Decimal128) => v.toString(),
};
const decimalOptionalField = {
  default: 0,
  type: Schema.Types.Decimal128,
  get: (v: Schema.Types.Decimal128) => v.toString()
};
const booksScema = new Schema(
  {
    addr: String,
    book: String ,
    rawPrice: decimalField,
    price: {
      required: true,
      type: {
        net: decimalField,
        gross: decimalField,
      },
    },
    prices: {
      required: true,
      type: [
        {
          net: decimalOptionalField,
          gross: decimalOptionalField,
        }
      ],
    },
  },
  {
    timestamps: true,
    versionKey: false,
    typePojoToMixed: false,
  }
);

1
Yahya KACEM 15 Янв 2021 в 08:56