具有未知密钥和嵌套文档作为值的Mongoose模式

时间:2014-09-15 21:31:18

标签: node.js mongodb mongoose

我有Mongo的文档看起来像这样:

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

就我而言,"老师","校长"和#34;学生"完全是任意的,可以是任何旧的字符串。在加载这个特定文档之前,它是未知的。但是,我知道此文档级别的每个属性的每个值都属于同一类型,因此可以对其进行验证。

我想将这些值中的每一个设为sub-document within Mongoose(a" Person")以利用Mongoose的验证;但是,我无法找到一种方法来告诉mongoose将所有值视为相同的模式类型而不管密钥。

顺便说一句,我无法将其转换为数组,其中每个人都有"角色"类型或类似的东西。遗憾的是,我无法控制数据结构,我只是去消费它!

任何想法都赞赏!

1 个答案:

答案 0 :(得分:0)

如果你接受这个作为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) {
    ...
});

这会解决您的问题吗?