Comment écouter pour un changement de collection MongoDB?
Je suis de créer une sorte de tâche en arrière-plan système de file d'attente avec MongoDB comme la banque de données. Comment puis-je "écouter" pour les inserts à une collection de MongoDB avant la ponte des travailleurs aux processus de travail? Ai-je besoin d'interroger toutes les quelques secondes pour voir si il y a des changements depuis la dernière fois, ou est-il possible que mon script peut attendre pour les insertions de se produire? C'est un projet PHP que je travail, mais n'hésitez pas à répondre en Ruby ou en langue agnostique.
- Changement de Flux a été ajouté dans MongoDB 3.6 à l'adresse de votre scénario. docs.mongodb.com/manual/changeStreams Aussi, si vous êtes en utilisant MongoDB Atlas vous pouvez tirer parti de la Couture Déclencheurs qui vous permettent d'exécuter des fonctions en réponse à insert/update/delete/etc. docs.mongodb.com/stitch/triggers/overview plus besoin d'analyser le oplog.
Vous devez vous connecter pour publier un commentaire.
Ce que vous pensez de sonne un peu comme des déclencheurs. MongoDB n'a pas de support pour les déclencheurs, cependant, certaines personnes ont "roulé leur propre" à l'aide de quelques astuces. La clé ici est la oplog.
Lorsque vous exécutez MongoDB dans un Jeu de Réplicas, tous les MongoDB actions sont enregistrées dans un journal des opérations (connu sous le nom oplog). Le oplog est fondamentalement juste une liste des modifications apportées aux données. Répliques Définit la fonction par l'écoute de changements sur cette oplog, puis d'appliquer les changements à l'échelle locale.
Est-ce son familier?
Je ne peux pas en détail l'ensemble du processus ici, c'est plusieurs pages de documentation, mais les outils dont vous avez besoin sont disponibles.
Tout d'abord, quelques write-ups sur le oplog
- Brève description
- Mise en page de l'
local
de la collection (qui contient le oplog)Vous voudrez aussi de l'effet de levier tailable curseurs. Ces éléments vont vous fournir un moyen de l'écouter pour que les modifications à la place de bureaux de vote pour eux. Notez que la réplication utilise tailable les curseurs, c'est donc une fonctionnalité prise en charge.
--replSet
option, et il permettra de créer / remplir laoplog
. Même sans le secondaire. C'est certainement la seule façon "d'écouter" les changements dans la DB.MongoDB a ce qu'on appelle
plafonné collections
ettailable curseurs
qui permet de MongoDB à envoyer des données aux auditeurs.Un
capped collection
est essentiellement une collection qui est d'une taille fixe et ne permet que des insertions. Voici à quoi il pourrait ressembler, pour en créer un:MongoDB Tailable curseurs (original post par Jonathan H. Salaire)
Ruby
PHP
Python (par Robert Stewart)
Perl (par Max)
Ressources Supplémentaires:
Ruby/Node.js le Didacticiel qui vous guide à travers la création d'une application à l'écoute de l'insère dans une MongoDB plafonné collection.
Un article qui parle de tailable curseurs plus en détail.
PHP, Ruby, Python, Perl et des exemples d'utilisation de tailable curseurs.
collection.find({query}, {tailable: true, await_data: true}).each {|document| ...}
Également vérifier shtylman.com/post/the-tail-of-mongodb où vous pouvez apprendre ce que vous avez besoin d'une initiale des données dans le curseur au début de la filatureDepuis MongoDB 3.6 il y aura un nouveau notifications API appelée Modifier les Flux que vous pouvez utiliser pour cela. Voir ce billet de blog pour un exemple. Exemple de ça:
Découvrez ce: Changement de Flux de
10 Janvier 2018 - Version 3.6
*EDIT: j'ai écrit un article sur la façon de le faire https://medium.com/riow/mongodb-data-collection-change-85b63d96ff76
https://docs.mongodb.com/v3.6/changeStreams/
Il y a de nouveau dans mongodb 3.6
https://docs.mongodb.com/manual/release-notes/3.6/ 2018/01/10
Afin d'utiliser changeStreams la base de données doit être un Réplication Ensemble
Votre Base de données sera un "Autonome" par défaut.
Suivantes exemple est une application pratique pour savoir comment vous pouvez l'utiliser.
* Spécifiquement pour le Nœud.
Liens utiles:
https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set
https://docs.mongodb.com/manual/tutorial/change-streams-example
https://docs.mongodb.com/v3.6/tutorial/change-streams-example
http://plusnconsulting.com/post/MongoDB-Change-Streams
MongoDB version 3.6 maintenant inclut le changement des ruisseaux qui est essentiellement une API sur le dessus de la OpLog permettant de déclencher/avis-comme des cas d'utilisation.
Voici un lien vers un exemple Java:
http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/
Un NodeJS exemple pourrait ressembler à quelque chose comme:
Sinon, vous pouvez utiliser la norme Mongo FindAndUpdate méthode, et dans le rappel, le feu à un EventEmitter événement (Nœud) lorsque le rappel est exécuté.
Toutes les autres parties de l'application ou de l'architecture à l'écoute de cet événement seront informés de la mise à jour, et toutes autres données pertinentes envoyé là-bas aussi. C'est vraiment une façon simple d'obtenir des notifications de Mongo.
Beaucoup de ces réponses ne vous donnera que de nouveaux enregistrements et de ne pas les mises à jour et/ou sont extrêmement ineffecient
Le seul fiable, performant façon de le faire est de créer un tailable curseur sur la bd locale: oplog.rs de la collection pour obtenir TOUTES les modifications apportées à MongoDB et en faire ce que vous voulez. (MongoDB même est-ce à l'interne plus ou moins de soutien de la réplication!)
Explication de ce que les oplog contient:
https://www.compose.com/articles/the-mongodb-oplog-and-node-js/
Exemple d'un Node.js bibliothèque qui fournit une API autour de ce qui est disponible pour être fait avec le oplog:
https://github.com/cayasso/mongo-oplog
Il y a un travail exemple java qui peut être trouvé ici.
La clé est LES OPTIONS DE REQUÊTE donné ici.
Aussi vous pouvez modifier à trouver de la requête, si vous n'avez pas besoin de charger toutes les données à chaque fois.
En fait, au lieu de regarder la sortie, pourquoi ne pas se faire remarquer quand quelque chose de nouveau est insérée à l'aide de middle-ware qui a été fourni par mangouste schéma
Vous pouvez prendre le cas de l'insertion d'un nouveau document et de faire quelque chose après cette insertion fait
Il s'agit d'un impressionnant ensemble de services disponibles appelé MongoDB Point. Regarder dans les fonctions de points ou de déclencheurs. Notons que c'est un nuage payé service (AWS). Dans votre cas, sur la notice, vous pourriez l'appeler une fonction personnalisée écrite en javascript.