2012-03-29 6 views
1

J'essaie d'ajouter un document incorporé à un champ de document existant. J'ai trouvé one fitting answer avec la recherche mais je cours dans des erreurs. J'utilise node.js, Express et Mongoose.Ajouter un document à un tableau de documents incorporé

Mes schémas de base de données:

var entry = new Schema({ 
    name  : { type : String, required : true}, 
    description : { type : String, default: ""}, 
}); 

var compo = new Schema({ 
    name  : String, 
    description : String, 
    entries  : [entry] 
}); 

Et je suis en train de mettre à jour le tableau des entrées avec le code suivant

var entry = new entryModel(); 
entry.name = "new name"; 
entry.description= "new description"; 

compoModel.findOne(query, function (err, item) { 
    if (item) { 
    item.entries.push(entry); 
    item.save(function (err) { 
     if (!err) { 
     log.debug('Entry added successfully.'); 
     } else { 
     log.error("Mongoose couldn't save entry: " + err); 
     } 
    }); 
    } 
}); 

Il donne une erreur: TypeError: Object.keys called on non-object

Qu'est-ce que j'ai manqué ?

Répondre

1

J'ai donc réussi à le faire fonctionner via la méthode Model.update en ajoutant simplement un nouvel objet à la liste compo.entries et en appelant compoModel.update.

1

Mon problème similaire (même erreur) a été résolu en effaçant le tableau de sous-document. Il a été rempli avant la définition du schéma de sous-document. Au moins c'est ce que je pense est arrivé.

.: par exemple

var token = new Schema({ value: String, expires: Date }) 
var user = new Schema({ username: String, tokens: [token] }) 

.. et, avant de définir le schéma 'jeton' i avait des entrées telles que:

{ username: 'foo', tokens: ['123456'] } 

.. donc, jetons de compensation ont fait pour moi.

user.tokens = [] 
user.save() 
Questions connexes