119 votes

La mongole se remplit après la sauvegarde

Je ne peux pas remplir manuellement ou automatiquement le champ "créateur" d'un objet nouvellement sauvegardé... la seule solution que je trouve est de réinterroger les objets que je possède déjà, ce que je n'aimerais pas faire.

Voici l'installation :

var userSchema = new mongoose.Schema({   
  name: String,
});
var User = db.model('User', userSchema);

var bookSchema = new mongoose.Schema({
  _creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
  description: String,
});
var Book = db.model('Book', bookSchema);

C'est là que je m'arrache les cheveux

var user = new User();
user.save(function(err) {
    var book = new Book({
        _creator: user,
    });
    book.save(function(err){
        console.log(book._creator); // is just an object id
        book._creator = user; // still only attaches the object id due to Mongoose magic
        console.log(book._creator); // Again: is just an object id
        // I really want book._creator to be a user without having to go back to the db ... any suggestions?
    });
});

EDIT : la dernière mangouste a corrigé ce problème et ajouté la fonctionnalité de populage, voir la nouvelle réponse acceptée.

12voto

Pratik Bothra Points 536

Juste pour développer et donner un autre exemple, car cela m'a aidé. Cela pourrait aider ceux qui veulent récupérer des objets partiellement remplis après la sauvegarde. La méthode est également légèrement différente. J'ai passé plus d'une heure ou deux à chercher la bonne façon de le faire.

  post.save(function(err) {
    if (err) {
      return res.json(500, {
        error: 'Cannot save the post'
      });
    }
    post.populate('group', 'name').populate({
      path: 'wallUser',
      select: 'name picture'
    }, function(err, doc) {
      res.json(doc);
    });
  });

2voto

Minh Toàn Points 11

Cela a fonctionné pour moi

    let post = await PostModel.create({
        ...req.body, author: userId
    })

    post = await post.populate('author', 'name')

    res.status(200).json({
        status: 'success',
        data: { post }
    })

1voto

freakish Points 20067

Malheureusement, c'est un problème de longue date avec la mangouste qui, je crois, n'est pas encore résolu :

https://github.com/LearnBoost/mongoose/issues/570

Ce que vous pouvez faire est d'écrire votre propre getter/setter personnalisé ( et de définir réel _customer dans une propriété séparée) pour cela. Par exemple :

var get_creator = function(val) {
    if (this.hasOwnProperty( "__creator" )) {
        return this.__creator;
    }
    return val;
};
var set_creator = function(val) {
    this.__creator = val;
    return val;
};
var bookSchema = new mongoose.Schema({
  _creator: {
     type: mongoose.Schema.Types.ObjectId,
     ref: 'User',
     get: get_creator,
     set: set_creator
  },
  description: String,
});

NOTE : Je ne l'ai pas testé et il se peut que cela fonctionne étrangement avec .populate et lors de la mise en place de l'id pur.

1voto

Whisher Points 1853

Mongoose 5.2.7

Cela fonctionne pour moi (juste beaucoup de maux de tête !).

exports.create = (req, res, next) => {
  const author = req.userData;
  const postInfo = new Post({
    author,
    content: req.body.content,
    isDraft: req.body.isDraft,
    status: req.body.status,
    title: req.body.title
  });
  postInfo.populate('author', '_id email role display_name').execPopulate();
  postInfo.save()
    .then(post => {
      res.status(200).json(post);
    }).catch(error => {
      res.status(500).json(error);
    });
};

0voto

kboom Points 93

Probablement qqch. comme

Book.createAsync(bookToSave).then((savedBook) => savedBook.populateAsync("creator"));

Ce serait la façon la plus agréable et la moins problématique de faire fonctionner ce système (en utilisant les promesses de Bluebird).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X