web-dev-qa-db-fra.com

Gérer les changements de schéma dans Mongoose

Quelle est la meilleure pratique (ou outil) pour mettre à jour/migrer les schémas Mongoose à mesure que l'application évolue?

69
mahemoff

Mise à jour: Testé, cela ne fonctionne pas dans sa forme actuelle, il a la bonne idée, j'ai eu une seule migration pour travailler avec un ajustement considérable de la module lui-même. Mais je ne le vois pas fonctionner comme prévu sans quelques changements majeurs et sans garder une trace des différents schémas.


On dirait que vous voulez des migrations de données de mangouste

Il est destiné à migrer les anciennes versions de schéma de vos documents au fur et à mesure que vous les utilisez, ce qui semble être le meilleur moyen de gérer les migrations dans mongodb.

Vous ne voulez pas vraiment exécuter des migrations complètes de jeux de données sur une collection de documents (ala alter table) car cela met une lourde charge sur vos serveurs et pourrait nécessiter un temps d'arrêt d'application/serveur. Parfois, vous devrez peut-être écrire un script qui saisit simplement tous les documents, applique le nouveau schéma/les modifications et appelle save, mais vous devez comprendre quand/où le faire. Un exemple pourrait être, l'ajout de la logique de migration à doc init a plus de résultats que la suppression du serveur pendant 3 heures pour exécuter des scripts de migration en vaut la peine.

J'ai trouvé cela link très utile également, réitère essentiellement ce qui précède plus en détail et implémente essentiellement le concept du package de nœuds ci-dessus en php.

N.B. Le module a 5 mois, 0 fourche, mais je regarde autour de moi et je ne trouve rien de mieux/de plus utile que le style de réponse d'Abdelsaid.

5
Louis

C'est drôle cependant, MongoDB est né pour répondre aux problèmes de schéma dans SGBDR. Vous n'avez rien à migrer, il vous suffit de définir la valeur par défaut dans la définition de schéma si le champ est obligatoire.

new Schema({
    name: { type: string }
})

à:

new Schema({
    name: { type: string },
    birthplace: { type: string, required: true, default: 'neverborn' }
});
36
vimdude

Je viens d'avoir ce problème où j'avais besoin de mettre à jour ma base de données pour refléter les modifications apportées à mon schéma. Après quelques recherches, j'ai décidé d'essayer la fonction updateMany () dans la console mongo pour effectuer les mises à jour et je pense que cela a plutôt bien fonctionné.

Pour appliquer cela à l'exemple de vimdude, le code ressemblerait à ceci:

try { db.<collection>.updateMany( { birthplace: null }, { $set: {"birthplace": "neverborn" } } ); } catch(e) { print(e); }

La fonction updateMany () mettra à jour tous les documents d'une collection en fonction d'un filtre. Dans ce cas, le filtre recherche tous les documents dont le champ 'lieu de naissance' est nul. Il définit ensuite un nouveau champ dans ces documents nommé "lieu de naissance" et définit sa valeur sur "jamais né".

Après avoir exécuté le code, modifié pour refléter vos circonstances, exécutez:

db.<collection>.find().pretty()

pour vérifier que les modifications ont bien été apportées. Le nouveau champ "lieu de naissance" avec la valeur "jamais né" devrait apparaître à la fin de chaque document de votre collection.

J'espère que ça t'as aidé.

6
Aaron Pennington