MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Le schéma auto-référencé de Mongoose ne crée pas d'ObjectId pour tous les sous-documents

Vous devez créer un nouvel objet lors de la déclaration de votre CollectPoint intégré articles :

var data = new CollectPoint({
    name: "Level 1",
    collectPoints: [
        new CollectPoint({
            name: "Level 1.1",
            collectPoints: []
        })
    ]
});

De cette façon, le _id et collectPoints sera créé par l'instanciation de CollectPoint sinon, vous créez simplement un JSONObject.

Pour éviter ce genre de problèmes, créez un validateur pour votre tableau qui déclenchera une erreur si ses éléments ont un mauvais type :

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'
        }
    }
});

Ainsi, ce qui suit déclenchera une erreur :

var data = new CollectPoint({
    name: "Level 1",
    collectPoints: [{
        name: "Level 1.1",
        collectPoints: []
    }]
});