猫鼬似乎在将输入对象强制转换为模型架构时会覆盖子文档的属性,如const product = new Product(jsonObj);
中所示。如果我从主文档模型的虚拟设置器中为子文档设置了属性,那么如果undefined
中包含子文档的任何其他属性,则它将被覆盖为jsonObj
。>
我要从CSV文件中获取“产品”数据,因此要在“变体”子文档中设置属性,请使用variant.title
作为列标题。转换为JSON后,我的输入数据将如下所示:
{
title: 'iPhone',
skuPrefix: 'ip',
variants: {
title: 'Black',
skuSuffix: 'b',
available: 5,
},
}
虚拟设置器和获取器的要点(如下面的代码所示)是从_sku
和skuPrefix
属性构建私有属性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);
但是,有比在猫鼬中做更好的方法了吗?