【问题标题】:Mongoose schemas with unknown keys and nested documents as values具有未知键和嵌套文档作为值的猫鼬模式
【发布时间】:2014-11-09 12:29:54
【问题描述】:

我有一个来自 Mongo 的文档,看起来像这样:

{
    teacher: { name: 'Fred' },
    principal: { name: 'Bob' },
    student: { name: 'Sally' }
}

在我的例子中,“teacher”、“principal”和“student”的属性是完全任意的,可以是任何旧字符串。在加载此特定文档之前,未知它们将是什么。但是,我知道此文档级别的每个属性的每个值都将属于同一类型,因此可以对其进行验证。

我想让这些值中的每一个都成为sub-document within Mongoose(一个“人”)以利用 Mongoose 的验证;但是,我找不到一种方法来告诉 mongoose 将所有值视为相同的模式类型,而不管键如何。

顺便说一句,我不能将它转换成一个数组,其中每个人都有“角色”类型或类似的东西。不幸的是,我不控制数据结构,我只是消费它!

任何想法表示赞赏!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    如果您将其作为 dict 接收,则可以实现一个转换器方法,尝试将每个键值解析为 Person,如下所示:

    var utils = require('restberry-utils');
    
    var PersonSchema = new mongoose.Schema({
        name: {type: String},
        ...
    });
    var Person = mongoose.model('Person', PersonSchema);
    
    var parsePersons = function(persons, next) {
        var parsedPersons = {};
        var names = Object.keys(persons);
        utils.forEachAndDone(names, function(name, iter) {
            var personData = persons[name];
            Person.findOne(personData, function(err, person) {
                if (err) ...
                if (!person) {
                    person = new Person(personData);
                }
                parsedPersons[name] = person;
                person.save(iter);
            })
        }, function() {
            next(parsedPersons);
        })
    };
    
    var persons = ...  // your dict
    parsePersons(persons, function(parsedPersons) {
        ...
    });
    

    这能解决您的问题吗?

    【讨论】:

    • @AdamTerlson 我知道你的意思。理想的解决方案是让它被自动解析,但你可以把它放在一些模块中,让它在任何人得到的时候被调用,模仿一些自动化。我不知道,天空是极限:P 你的东西是什么?
    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2019-03-22
    • 2016-01-05
    • 2015-01-06
    • 2021-10-06
    • 2020-05-14
    相关资源
    最近更新 更多