猫鼬如何使用.add与虚拟重用架构

我有一个用例,我想用虚拟定义一个架构,然后在多个地方使用该架构。为此,我在猫鼬文档中找到了.add属性,如here所示。

这不是我期望的行为,默认情况下,虚拟机不会填充。我查看了生成的特定架构,发现使用“ .add”创建它后,它不会保留原始架构的所有字段。特别是在“虚拟”对象中,“路径”属性变为空对象而不是字符串,而在“树”对象中,虚拟完全消失了。

我仔细检查了实际的依赖关系,发现这是“ .add”内部工作方式的结果,即它调用了一个名为“ merge”的函数,该函数将许多属性复制到新架构上。值得注意的是,合并功能对架构上的“树”对象不执行任何操作,对于虚拟机,它会复制名称/选项/获取器/设置程序,但对“路径”不执行任何操作。我手动将缺少的部分添加到了合并功能中,它解决了我的问题,但是我想知道我是不是使用不正确,还是这是猫鼬库中的错误,因为直接更新依赖项不是对我来说有效的解决方案。

这是我实例化架构的一个例子

const testBase= data.db.Schema({
    test: {type: String,required: true}
});
testBase.virtual('testVirtual')
.get(function () {
    return "test";
});
testBase.set('toObject',{virtuals: true});
testBase.set('toJSON',{virtuals: true});

const testParent = data.db.Schema();
testParent.add(testBase);
testParent.set('toObject',{virtuals: true});
testParent.set('toJSON',{virtuals: true});

在此示例中,如果我在模型中使用“ testBase”作为架构,则它将正确使用虚拟,而如果使用“ testParent”,则不会。当我期望它们的行为相同时。

获取两个模式的JSON可以在testBase上看到

{
"$id": 24,"_indexes": [],"_userProvidedOptions": {
    "toJSON": {
        "virtuals": true
    },"toObject": {
        "virtuals": true
    }
},"aliases": {},"callQueue": [],"childSchemas": [],"inherits": {},"methodOptions": {},"methods": {},"nested": {},"obj": {
    "test": {
        "required": true
    }
},"options": {
    "_id": true,"autoIndex": null,"bufferCommands": true,"capped": false,"discriminatorKey": "__t","id": true,"minimize": true,"noId": false,"noVirtualId": false,"read": null,"shardKey": null,"strict": true,"toJSON": {
        "virtuals": true
    },"toObject": {
        "virtuals": true
    },"typeKey": "type","validateBeforeSave": true,"versionKey": "__v"
},"paths": {
    "_id": {
        "$immutable": null,"_index": null,"getters": [],"instance": "ObjectID","options": {
            "auto": true
        },"path": "_id","setters": [
            null
        ],"validators": []
    },"test": {
        "$immutable": null,"enumValues": [],"instance": "String","isrequired": true,"options": {
            "required": true
        },"originalRequiredValue": true,"path": "test","regExp": null,"setters": [],"validators": [
            {
                "message": "Path `{PATH}` is required.","type": "required"
            }
        ]
    }
},"plugins": [],"query": {},"s": {
    "hooks": {
        "_posts": {},"_pres": {}
    }
},"singlenestedPaths": {},"statics": {},"subpaths": {},"tree": {
    "_id": {
        "auto": true
    },"test": {
        "required": true
    },"testVirtual": {
        "getters": [
            null
        ],"options": {},"path": "testVirtual","setters": []
    }
},"virtuals": {
    "testVirtual": {
        "getters": [
            null
        ],"setters": []
    }
}

}

而这对于testParent

{
"$id": 25,"test": {
        "required": true
    }
},"path": {},"setters": []
    }
}

}

如果您比较缺少的架构,则可以看到哪些字段丢失。如果有人知道按照这些方式使用此功能或示例的正确方法,我将不胜感激。 (我的测试是使用猫鼬5.7.8版完成的)

xy328545073 回答:猫鼬如何使用.add与虚拟重用架构

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3139823.html

大家都在问