web-dev-qa-db-fra.com

MongoDB - Erreur: le document doit avoir un _id avant de sauvegarder

Je me suis beaucoup battu avec ce projet. Je suis un tutoriel qui est obsolète dans certains domaines, par exemple, leur version de Jquery utilisait un format totalement différent pour certaines fonctions et je devais faire beaucoup de changements. Mais je pense qu'il me reste un dernier problème majeur pour lequel je n'arrive pas à trouver une solution. Dans ma variable de schéma, j'ai les types _id, nom d'utilisateur et mot de passe

var UserSchema = new mongoose.Schema({
    _id: mongoose.Schema.ObjectId,
    username: String,
    password: String
}); 

mais lorsque j'essaie d'ajouter un nouvel utilisateur à mon application, au lieu de recevoir l'alerte que je suis censé recevoir, elle s'affiche sous la forme [object Object] et rien n'est ajouté à la base de données. Ensuite, cette erreur apparaît dans le mongo cmd 

"Erreur: le document doit avoir un _id avant de sauvegarder".

J'ai essayé de commenter la ligne _id et je reçois le bon message, mais rien ne s'affiche dans ma base de données.

8
Matt Lee

C'est assez simple:

  1. Si vous avez déclaré explicitement le champ _id dans le schéma, vous devez l'initialiser explicitement
  2. Si vous ne l'avez pas déclaré dans le schéma, MongoDB le déclarera et l'initialisera.

Ce que vous ne pouvez pas faire, c'est de l'avoir dans le schéma et de ne pas l'initialiser. Il va jeter l'erreur dont vous parlez

16
dasfdsa

Essayez l'extrait ci-dessous, je voulais nommer _id car userId vous pouvez aussi vous en passer.

var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;

var UserSchema = new Schema({
    username: String,
    password: String
});
UserSchema.virtual('userId').get(function(){
    return this._id;
});

1
user3172272

_id est ajouté automatiquement par MongoDb.

Si vous voulez conserver _id sur votre structure de données, assurez-vous d’initialiser correctement:

var obj = new UserSchema({ 
    "_id": new ObjectID(), 
    "username": "Bill", 
    "password" : "...." 
});
1
Andrea Girardi