猫鼬会在创建新模型时覆盖虚拟设置员设置的子文档值

时间:2018-11-14 02:39:32

标签: node.js mongodb mongoose

猫鼬似乎在将输入对象强制转换为模型架构时会覆盖子文档的属性,如const product = new Product(jsonObj);中所示。如果我从主文档模型的虚拟设置器中为子文档设置了属性,那么如果undefined中包含子文档的任何其他属性,则它将被覆盖为jsonObj

我要从CSV文件中获取“产品”数据,因此要在“变体”子文档中设置属性,请使用variant.title作为列标题。转换为JSON后,我的输入数据将如下所示:

{
  title: 'iPhone',
  skuPrefix: 'ip',
  variants: {
    title: 'Black',
    skuSuffix: 'b',
    available: 5,
  },
}

虚拟设置器和获取器的要点(如下面的代码所示)是从_skuskuPrefix属性构建私有属性skuSuffix,因此{{1 }}在此示例中为_sku。这可以正常工作。

我的问题是,当我想要一个单变量产品时,其中的值类似ip-b,但没有variants.available。举第二个例子:

variants.skuSuffix

我希望{ title: 'iPhone', skuPrefix: 'ip', variants: { available: 12, }, } _sku,但是它是ip,因为undefined数组为空,而我创建的放置{{1}的对象}被Mongoose抓取对象属性并到达variants的{​​{1}}属性时创建的对象替换。

我有一个用虚拟属性定义的猫鼬“产品”架构。这是我的产品架构的简化版本:

_sku

我定义了猫鼬的“变体”模式(也简化了),如下所示:

variants

我不得不创建很长的代码来替换jsonObj。以下代码有效:

const mongoose = require('mongoose');
const variantSchema = require('./variant.schema');
const ProductSchema = new mongoose.Schema({
  title: String,
  _skuPrefix: String,
  variants: [variantSchema],
});

ProductSchema.virtual('skuPrefix')
  .set(function setSkuPrefix(skuPrefix) {
    if (!skuPrefix) return;

    if (!this.variants) this.variants = [];

    if (this.variants.length === 0) {
      const variant = {
        '_sku': this.skuPrefix,
        title: this.title,
      };
      this.variants.push(variant);
      return;
    }

    const parent = this;
    this.variants.forEach((child) => {
      if (child._skuSuffix) {
        child._sku = `${parent._skuPrefix}-${child._skuSuffix}`;
    });
  })
  .get(function getSkuPrefix() {
    return this._skuPrefix;
  });

module.exports = mongoose.model('Product', ProductSchema);

但是,有比在猫鼬中做更好的方法了吗?

0 个答案:

没有答案