Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 具有未知键和嵌套文档作为值的Mongoose模式_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 具有未知键和嵌套文档作为值的Mongoose模式

Node.js 具有未知键和嵌套文档作为值的Mongoose模式,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一份来自Mongo的文件,看起来像这样: { teacher: { name: 'Fred' }, principal: { name: 'Bob' }, student: { name: 'Sally' } } var utils = require('restberry-utils'); var PersonSchema = new mongoose.Schema({ name: {type: String}, ... }); var Pers

我有一份来自Mongo的文件,看起来像这样:

{
    teacher: { name: 'Fred' },
    principal: { name: 'Bob' },
    student: { name: 'Sally' }
}
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) {
    ...
});
在我的例子中,“教师”、“校长”和“学生”的属性完全是任意的,可以是任何旧字符串。在加载此特定文档之前,还不知道它们将是什么。但是,我知道此文档级别的每个属性的每个值都是相同的类型,因此可以对其进行验证

我想让这些价值观中的每一个都成为(一个“人”)来利用猫鼬的验证;但是,我无法找到一种方法告诉mongoose将所有值视为相同的模式类型,而不考虑键

顺便说一下,我不能将其转换为每个人都有“角色”类型或类似类型的数组。不幸的是,我不能控制数据结构,我只能使用它


任何想法都值得赞赏

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

{
    teacher: { name: 'Fred' },
    principal: { name: 'Bob' },
    student: { name: 'Sally' }
}
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我知道你的意思。理想的解决方案是让它自动解析,但你可以把它放在某个模块中,让它在任何时候都被调用,模仿一些自动化。我不知道,天空是极限:你是什么东西?