2017-09-22 4 views
0

Un de mes serveurs de noeud a un travail de vérification d'un FTP pour un fichier XML, si on le trouve, il le convertit en JSON. Maintenant, son travail consiste à effacer une base de données couchdb, et ont toutes les nouvelles données trouvées dans le fichier XML remplacer ce qui était là auparavant.Existe-t-il un bon moyen de remplacer tous les objets couchDB dans un ensemble?

Maintenant que je ne veux pas que la base de données soit réellement vide (ou inexistante) à tout moment je ne l'ai pas simplement détruite puis recréée avec le nouvel ensemble de données. Mon serveur de noeud a été répliqué de la base de données vers pouchdb local, l'a effacé (suppression douce), puis a placé toutes les nouvelles données dedans, puis s'est répliqué jusqu'à la base de données de couchdb.

On dirait que le téléchargement devrait être complètement inutile et il devrait y avoir un moyen de le faire avec une suppression difficile. Est-il possible de remplacer simplement tous les objets d'une base de données CouchDB actuelle par un nouvel ensemble d'objets que mon serveur de noeud répliquerait?

Merci pour toute aide

+0

Est-ce qu'un purge + compact exécuterait régulièrement le problème de suppression en douceur par rapport à la suppression en dur? – Shard

Répondre

1

CouchDB conserve le document historique des révisions dans un arbre, afin de remplacer un document (disons un document avec un _id de « x ») avec une version plus récente exige de connaître la révision actuelle de _id/_rev paire dans ou pour être en mesure de le mettre à jour.

Donc, si vous avez besoin de mettre à jour le document « x » vous devez

// fetch the document first 
curl -X GET http://localhost:5984/mydb/x 
{ "_id": "x", "_rev": "45-123", "name": "fred"} 
// to be able to update it 
curl -X PUT -d'{ "_id": "x", "_rev": "45-123", "name": "Fred Smith"}' http://localhost:5984/mydb/x 
{ "ok": "true", "_id": "x", "_rev": "46-456"} 

Vous pouvez réécrire votre travail pour effectuer cette opération GET/PUT pour chaque document qui a changé.

Si vous souhaitez que les données soient effacées avant d'importer les nouvelles données, créez simplement une nouvelle base de données, par ex. "mydb2017-09-22", importez les données et dites à l'application qui utilise les données d'utiliser "mydb2017-09-22" comme source de vérité. Vous pouvez ensuite supprimer en toute sécurité la base de données canonique précédente. Cela évite l'étape de réplication dans votre solution actuelle.

La purge n'est pas prise en charge dans CouchDB actuel, car elle affecte les implémentations dans lesquelles les données sont répliquées. Le compactage sert à supprimer les révisions de documents plus anciennes et indésirables afin d'économiser de l'espace. Je ne sais pas tout sur votre problème, je suggère de regarder la solution "une base de données par importation" car il vous permet de simplement basculer entre les ensembles de données lorsque l'importation est terminée et il se nettoie après lui-même en supprimant l'ancienne base de données .

+0

"Si vous avez besoin que les données soient effacées avant d'importer les nouvelles données, créez simplement une nouvelle base de données, par exemple" mydb2017-09-22 ", importez les données et dites à l'application qui utilise les données" mydb2017-09-22 "comme la source de la vérité". . . . . Comment serais-je en mesure de dire à l'application d'utiliser cette base de données à la place, sûrement il est préférable d'avoir des bases de données avec des noms statiques dont l'application se synchronise – Shard

+1

Cela dépend de ce qui est plus important pour vous. On dirait que vous allez avoir beaucoup de mal à reproduire les données sur l'endroit. Ma suggestion crée une base de données propre pour chaque importation, puis votre application bascule vers la nouvelle base de données lorsqu'elle est prête. Il joue sur les points forts de CouchDB qui supprime gentiment les bases de données entières, mais laisse les données traîner lors de la suppression ou de la mise à jour des documents. La réponse courte à votre question est qu'il n'y a pas moyen de remplacer tous les documents dans un ensemble sans supprimer la base de données et la recréer, mais cela laisserait un peu de temps sans données. –

+0

Ok, merci Glynn, je vais avoir une base de données nommée statique avec un seul objet indiquant à mon application quelles bases de données utiliser afin de pouvoir appliquer votre solution. Je serai de retour la semaine prochaine – Shard