Lancer un objet simple à un document de mangouste

MISE À JOUR: 5 votes ont été reçus, j'ai donc soumis une demande de fonctionnalité: https://github.com/LearnBoost/mongoose/issues/2637

Lancez vos votes +1 pour permettre à l'équipe centrale de savoir que vous voulez cette fonctionnalité.


MISE À JOUR 2: voir la réponse ci-dessous …


Disons que je fais une requête "lean" sur une collection OU reçois des données d'un service REST et je reçois un ensemble d'objets (pas de mannequin).

Ces objets existent déjà dans la base de données, mais j'ai besoin de convertir certains / tous ces objets en documents de mangous pour l'édition / l'enregistrement individuel.

J'ai lu la source et il y a beaucoup de choses sur le fait que les mannequins possèdent des données de la base de données (peuplement, casting, initialisation, etc.), mais il ne semble pas y avoir de méthode pour «l'exposer» au monde extérieur.

J'utilise ce qui suit, mais cela semble difficile ( $data est un objet simple):

 // What other properties am I not setting? Is this enough? var doc = new MyModel( $data ); doc.isNew = false; // mimicking mongoose internals // "init" is called internally after a document is loaded from the database // This method is not documented, but seems like the most "proper" way to do this. var doc = new MyModel( undefined ); doc.init( $data ); 

MISE À JOUR: après plus de recherche, je ne pense pas qu'il existe un moyen de le faire encore, et la première méthode ci-dessus est votre meilleur pari (mongoose v3.8.8). Si quelqu'un d'autre s'intéresse à cela, je vais faire une demande de fonctionnalité pour quelque chose comme ça (laisser un commentaire ou upvote s'il vous plaît):

 var doc = MyModel.hydrate( $data ); 

  • Comment supprimer des propriétés vides d'un objet JavaScript multi-profondeur?
  • Imprimer le contenu de l'objet JavaScript?
  • Les fonctions javascript sont des objets?
  • Objet vs primitif
  • Comment déclarer des objets imbriqués en JavaScript?
  • Javascript: comment créer de manière dynamique des objets imbriqués à l'aide de noms d'objets donnés par un tableau
  • Créer un objet avec des clés dynamiques
  • Fusionner / étendre les tableaux d'objets javascript en fonction de la jointure d'une propriété clé dans chaque
  • 2 Solutions collect form web for “Lancer un objet simple à un document de mangouste”

    Affichage de ma propre réponse afin que cela ne reste pas ouvert:

    Les modèles de la version 4 (version stable en 2015-03-25) exposent maintenant une méthode hydrate() . Aucun des champs ne sera marqué comme étant sale initialement, ce qui signifie qu'un appel à save() ne fera rien avant qu'un champ ne soit muté.

    https://github.com/LearnBoost/mongoose/blob/41ea6010c4a84716aec7a5798c7c35ef21aa294f/lib/model.js#L1639-1657

    Il est très important de noter que cela est destiné à convertir un objet JS simple chargé de la base de données en un document de mangouste. Si vous recevez un document d'un service REST ou quelque chose comme ça, vous devez utiliser findById() et update() .

    Pour ceux qui vivent dangereusement:

    Si vous souhaitez vraiment mettre à jour un document existant sans toucher la base de données, je suppose que vous pouvez appeler hydrate() , marquer les champs comme sales, puis appeler save() . Ce n'est pas trop différent de la méthode de configuration doc.isNew = false; Comme je l'ai suggéré dans ma question initiale (sauf que vous ne devez pas marquer les champs comme sales). Cependant, Valeri (de l'équipe de mangouste) a suggéré de ne pas faire cela. Cela pourrait entraîner des erreurs de validation (et d'autres problèmes) dans certains scénarios et n'est en général pas une bonne pratique.

    1. Si vous recevez une réponse du service REST et que vous avez un modèle de mannequin utilisateur
     var User = mongoose.model('User'); var fields = res.body; //Response JSON var newUser = new User(fields); newUser.save(function(err,resource){ console.log(resource); }); 
    JavaScript rend le site Web intelligent, beauté et facile à utiliser.