MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Esquema auto-referenciado do Mongoose não criando ObjectId para todos os subdocumentos


Você deve construir um novo objeto ao declarar seu CollectPoint incorporado Unid :
var data = new CollectPoint({
    name: "Level 1",
    collectPoints: [
        new CollectPoint({
            name: "Level 1.1",
            collectPoints: []
        })
    ]
});

Desta forma, o _id e collectPoints será criado pela instanciação de CollectPoint caso contrário, você está apenas criando um JSONObject simples.

Para evitar esse tipo de problema, crie um validador para sua matriz que acionará um erro se seus itens tiverem o tipo errado:
var CollectPointSchema = new mongoose.Schema({
    name: { type: String },
    collectPoints: {
        type: [this],
        validate: {
            validator: function(v) {
                if (!Array.isArray(v)) return false
                for (var i = 0; i < v.length; i++) {
                    if (!(v[i] instanceof CollectPoint)) {
                        return false;
                    }
                }
                return true;
            },
            message: 'bad collect point format'
        }
    }
});

Desta forma, o seguinte irá acionar um erro:
var data = new CollectPoint({
    name: "Level 1",
    collectPoints: [{
        name: "Level 1.1",
        collectPoints: []
    }]
});