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.

0voto

WouldBeNerd Points 303

J'ai fini par écrire quelques fonctions Promise curry-able où vous déclarez votre schéma, votre adaptateur de requête, vos fonctions d'adaptateur de données et remplissez la chaîne à l'avance. Pour une implémentation plus courte et plus simple, c'est plus facile.

Ce n'est probablement pas très efficace, mais j'ai trouvé l'exécution assez élégante.

fichier github : curry_Promesses.js

déclaration

const update_or_insert_Item = mDB.update_or_insert({
    schema : model.Item,
    fn_query_adapter : ({ no })=>{return { no }},
    fn_update_adapter : SQL_to_MDB.item,
    populate : "headgroup"
    // fn_err : (e)=>{return e},
    // fn_res : (o)=>{return o}
})

exécution

Promise.all( items.map( update_or_insert_Item ) )
.catch( console.error )
.then( console.log )

0voto

Sehrish Waheed Points 61

Sauvegarder le document dans le modèle, puis le remplir

   chatRoom = await chatRoom.save();
   const data = await chatRoom
  .populate("customer", "email dp")
  .populate({
    path: "admin",
    select: "name logo",
  })
  .execPopulate();

0voto

Ed Hollinghurst Points 74

Dans Mongoose 6.x vous pouvez simplement faire :

const t = await MyModel.create(value).then((t) =>
  t.populate('my-path')
);

Le site execPopulate() a été supprimée.

0voto

Sehrish Waheed Points 61

Rien n'a fonctionné pour moi, j'ai donc sauvegardé et ensuite utilisé findById pour récupérer ces données avec populate à nouveau.

const data: any = await Model.findById(id)
  .populate("name")

-1voto

Ahmed Ghrib Points 396

Je n'ajoute rien de nouveau ici.

C'est juste une façon plus propre d'écrire cela en utilisant async/await :

const newCourse = new Course(new_course_data);
const populate_options = [
  // Here write your populate options
];
const created_course = await newCourse.save();
await created_course.populate(populate_options).execPopulate();

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