SlideShare ist ein Scribd-Unternehmen logo
1 von 56
Time for a
Change Stream
By Leigha Mitchell & Edward Robinson
@LeighaNotLeia @earobinson
Change streams and
using them to version
your data
The hubba stack
● MEANR - Mongo, Express, Angular, Node, React
● Many Services (Payments, Products, Users, etc)
● Three Engineering teams (one Python, two JS)
● AWS, GCP, MongoDB Atlas, RabbitMQ, Redis, etc
● Mongoose, Mongo Native Driver
What is a change stream?
Change streams allow applications to access real-
time data changes without the complexity and risk
of tailing the oplog. Applications can use change
streams to subscribe to all data changes on a
collection and immediately react to them. --
https://docs.mongodb.com/manual/changeStrea
ms/
Why are we here?
Hubba
● 6 year old company
● Networking for Brands and Buyers
● Microservices
● Decided to launch ordering
The exact product you ordered must be
delivered to you
Ordering must haves
This Not this
What exactly is a version?
A particular form of something differing in certain
respects from an earlier form or other forms of the
same type of thing. --
https://www.google.com?q=define+version
1. Options
➔ Not versioning
Previously wasn’t needed, continue to
not us this
➔ Make copy
How do we know what to copy?
➔ In-app versioning
Lean into Mongoose and version the
app
➔ Oplog versioning
Write new service to consume the
oplog
Not versioning
Would have locked
orderable products
Make a copy
Knowing what to copy is
hard
In-app Versioning
Works great, if you’re
building from scratch
model.save()
vs
db.getCollection('users').update({},
{$set: {name: ‘frodo’}})
Denormalization:
Denormalization allows you to avoid some application-
level joins, at the expense of having more complex and
expensive updates. Denormalizing one or more fields
makes sense if those fields are read much more often
than they are updated. --
https://www.mongodb.com/blog/post/6-rules-of-
thumb-for-mongodb-schema-design-part-3
Denormalization Example - Pre bearer of the ring
Users / Hobbits
{
_id : 1,
name : Frodo,
occupation: unemployed
}, {
_id : 2,
name : Sam,
occupation: unemployed
},
Messages
{
_id : 93,
from : 2,
to: 1,
fromOccupation: unemployed,
toOccupation: unemployed,
message: What do you call a hobbit party?
}, {
_id : 94,
from : 1,
to: 2,
fromOccupation: unemployed,
toOccupation: unemployed,
message: A little get together.
}
Denormalization Example - Post bearer of the ring
Users / Hobbits
{
_id : 1,
name : Frodo,
occupation: Bearer of the ring
}, {
_id : 2,
name : Sam,
occupation: Protector of Frodo
},
Messages
{
_id : 93,
from : 2,
to: 1,
fromOccupation: Protector of Frodo,
toOccupation: Bearer of the ring,
message: What do you call a hobbit party?
}, {
_id : 94,
from : 1,
to: 2,
fromOccupation: Bearer of the ring,
toOccupation: Protector of Frodo,
message: A little get together.
}
message.update({to: ObjectId: 1}, {$set: {toOccupation: Bearer of the ring}}, {multi: true})
Oplog Versioning
So what did we choose?
So what did we choose?
None of them!
Along comes:
MongoDB 3.6
Now with
Change Streams!
2. Why Mongo 3.6
➔ Easy Versioning
Ability to do versioning without
significant architecture changes
➔ Raw Queries
Allowed us to use existing raw queries
without altering to support versioning
➔ Many Sources
No front-end data consumers did not
need to be altered
MongoDBWebsite
Product
Service
Orders
Service
History
Service
Hubba Services
Creating a Product
Website
Products
Service
MongoDB
History
Service
Create
Version 0
Create
Version 0
Create
Version 0
Created
Version 0
Created
Version 0
Ordering a Product
Website
Orders
Service
History
Service
MongoDB
Order
Version 0
Order
Version 0
Order
Version 0
Yes You
Can!
Ordered
Version 0
But what about the raw
queries??
But what about the raw
queries??
The version numbers are
Human Readable : SHA
42:c3f42aeb1c3d85b5a1594a5d0a727fcdf58a33ac
But what about the raw
queries??
The version numbers are
Human Readable : SHA
42:c3f42aeb1c3d85b5a1594a5d0a727fcdf58a33ac
But what about the raw
queries??
The version numbers are
Human Readable : SHA
42:c3f42aeb1c3d85b5a1594a5d0a727fcdf58a33ac
Autonomy of a Change Stream
{
_id : { <BSON Object> },
“operationType” : “<operation>“,
“fullDocument” : { <document> },
“ns” : {
“db” : “<database>“,
“coll” : “<collection”
},
“documentKey” : { “_id” : <ObjectId> },
“updateDescription” : {
“updatedFields” : { <document> },
“removedFields” : [ “<field>“, ... ]
}
}
Autonomy of a Change Stream
{
_id : { <BSON Object> },
“operationType” : “<operation>“,
“fullDocument” : { <document> },
“ns” : {
“db” : “<database>“,
“coll” : “<collection”
},
“documentKey” : { “_id” : <ObjectId> },
“updateDescription” : {
“updatedFields” : { <document> },
“removedFields” : [ “<field>“, ... ]
}
}
Insert
Delete
Update
Replace
Invalidate
Autonomy of a Change Stream
{
_id : { <BSON Object> },
“operationType” : “<operation>“,
“fullDocument” : { <document> },
“ns” : {
“db” : “<database>“,
“coll” : “<collection”
},
“documentKey” : { “_id” : <ObjectId> },
“updateDescription” : {
“updatedFields” : { <document> },
“removedFields” : [ “<field>“, ... ]
}
}
Autonomy of a Change Stream
{
_id : { <BSON Object> },
“operationType” : “<operation>“,
“fullDocument” : { <document> },
“ns” : {
“db” : “<database>“,
“coll” : “<collection>”
},
“documentKey” : { “_id” : <ObjectId> },
“updateDescription” : {
“updatedFields” : { <document> },
“removedFields” : [ “<field>“, ... ]
}
}
Autonomy of a Change Stream
{
_id : { <BSON Object> },
“operationType” : “<operation>“,
“fullDocument” : { <document> },
“ns” : {
“db” : “<database>“,
“coll” : “<collection”
},
“documentKey” : { “_id” : <ObjectId> },
“updateDescription” : {
“updatedFields” : { <document> },
“removedFields” : [ “<field>“, ... ]
}
}
Autonomy of a Change Stream
{
_id : { <BSON Object> },
“operationType” : “<operation>“,
“fullDocument” : { <document> },
“ns” : {
“db” : “<database>“,
“coll” : “<collection”
},
“documentKey” : { “_id” : <ObjectId> },
“updateDescription” : {
“updatedFields” : { <document> },
“removedFields” : [ “<field>“, ... ]
}
}
Change Streams in Action
Insert a message
Mongo Query
db.getCollection('messages').insert({from: 2, to: 1, fromOccupation: 'unemployed', toOccupation:
'unemployed', message: 'What do you call a habbit party?', version: 0})
Document
{
"_id" :
ObjectId("5b0b6c7adce137d2655f7efe"),
"from" : 2,
"to" : 1,
"fromOccupation" : "unemployed",
"toOccupation" : "unemployed",
"message" : "What do you call a habbit
party?",
"version" : 0
}
Change Stream
{
"_id":{
"_data":"glsLbHoAAAABRmRfaWQAZFsLbHrc
4TfSZV9+/gBaEASgyrHmfadIaLKbJfTNB8BgB
A=="
},
"operationType":"insert",
"fullDocument":{...},
"ns":{ "db":"hubba", "coll":"messages" },
"documentKey":{
"_id":"5b0b6c7adce137d2655f7efe"
}
Insert History Document
Update a message
Mongo Query
db.getCollection('messages').update({_id: ObjectId("5b0b6c7adce137d2655f7efe")}, {$set: {version: 1,
message : "What do you call a hobbit party?"}})
Document
{
"_id" :
ObjectId("5b0b6c7adce137d2655f7efe"),
"from" : 2,
"to" : 1,
"fromOccupation" : "unemployed",
"toOccupation" : "unemployed",
"message" : "What do you call a hobbit
party?",
"version" : 1
}
Change Stream
{
"_id": {
}, "operationType":"update",
"fullDocument":{...},
"Ns":{"db":"hubba","coll":"messages"}, "documentKey":
{... },
"updateDescription":{
"updatedFields":{
"message":"What do you call a hobbit party?",
"version":1
},
"removedFields":{}
}
}
Update History Document
Implementation
- Proof of concept
- Used full document to consume all changes
from Mongo and write them to our DB
- Successfully mirrored actual documents
Gotcha #1
Principle of eventual consistency
- Full document wouldn’t always represent the
document that existed in the DB
Lesson: If you’re using change streams for event sourcing,
you can source attributes out of the update description, but
not out of the full document
Solution:
Be more like a database
Change Streams are guaranteed to be delivered in
the order that the change happens. Source the
events as they happen, and apply update
description to the previous version
Gotcha #2
How do we Bootstrap versions into DB
- With lack of insert events for all records, how do we get
them into the DB?
Solution:
Use full document
If we can’t find a previous event, just use full
document
Gotcha #3
How do you ensure you record each write only once?
Solution:
Change streams guarantee that each
change will be delivered in order once
and only once.
Gotcha #4
Large documents can cause issues
Solution:
Don’t do it.
Seriously we don’t. 16Mb is a lot of data!
Gotcha #5
We fell off the Oplog
If your oplog can hold 100 documents, and I fill it up with
messages, you will not be able to resume the products
change stream
Solution:
We got a bigger oplog and update our
versioned collections
We build a script to run every hour and randomly
update one of the documents in every versioned
collection
Cons
➔ Histories has no context
Histories is unable to validate the data
it gets, its just a blind data store
➔ Spinning up a whole service
We could have solved this with in app
versioning, now we maintain an extra
service
➔ Issues upgrading
We had a few road bumps with
performance when we first released
mongo 3.6 + the new drivers
Benefits
➔ Histories is isolated
As long as our data is persisted we
have a history of it
➔ We get to keep our raw queries
Our denormalization strategies
continue to work
➔ Language support
We do not need to implement a history
support for every language we use, just
a version generator, if we want access.
Metrics
Conclusion:
1. Change streams are a great way to follow updates to
your documents
2. Using change streams for event sourcing would be
amazing
3. If you are versioning data in a legacy app, change
streams may be for you
Demo
Thank you!

Weitere Àhnliche Inhalte

Was ist angesagt?

7 1 manual_deleter_v3_ricksdkfjskfj
7 1 manual_deleter_v3_ricksdkfjskfj7 1 manual_deleter_v3_ricksdkfjskfj
7 1 manual_deleter_v3_ricksdkfjskfjKunal Mittal
 
Dealing with Azure Cosmos DB
Dealing with Azure Cosmos DBDealing with Azure Cosmos DB
Dealing with Azure Cosmos DBMihail Mateev
 
Introduction to NOSQL And MongoDB
Introduction to NOSQL And MongoDBIntroduction to NOSQL And MongoDB
Introduction to NOSQL And MongoDBBehrouz Bakhtiari
 
Back to Basics: My First MongoDB Application
Back to Basics: My First MongoDB ApplicationBack to Basics: My First MongoDB Application
Back to Basics: My First MongoDB ApplicationMongoDB
 
Back to Basics Webinar 2: Your First MongoDB Application
Back to Basics Webinar 2: Your First MongoDB ApplicationBack to Basics Webinar 2: Your First MongoDB Application
Back to Basics Webinar 2: Your First MongoDB ApplicationMongoDB
 
Back to Basics Webinar 3: Schema Design Thinking in Documents
 Back to Basics Webinar 3: Schema Design Thinking in Documents Back to Basics Webinar 3: Schema Design Thinking in Documents
Back to Basics Webinar 3: Schema Design Thinking in DocumentsMongoDB
 
MVP Cloud OS Week Track 1 9 Sept: Data liberty
MVP Cloud OS Week Track 1 9 Sept: Data libertyMVP Cloud OS Week Track 1 9 Sept: Data liberty
MVP Cloud OS Week Track 1 9 Sept: Data libertycsmyth501
 
MongoDB Java Development - MongoBoston 2010
MongoDB Java Development - MongoBoston 2010MongoDB Java Development - MongoBoston 2010
MongoDB Java Development - MongoBoston 2010Eliot Horowitz
 
ActiveRecord vs Mongoid
ActiveRecord vs MongoidActiveRecord vs Mongoid
ActiveRecord vs MongoidIvan Nemytchenko
 
Mongo-Drupal
Mongo-DrupalMongo-Drupal
Mongo-DrupalForest Mars
 
Using Mongoid with Ruby on Rails
Using Mongoid with Ruby on RailsUsing Mongoid with Ruby on Rails
Using Mongoid with Ruby on RailsNicholas Altobelli
 
Building Your First MongoDB App ~ Metadata Catalog
Building Your First MongoDB App ~ Metadata CatalogBuilding Your First MongoDB App ~ Metadata Catalog
Building Your First MongoDB App ~ Metadata Cataloghungarianhc
 
Optimize drupal using mongo db
Optimize drupal using mongo dbOptimize drupal using mongo db
Optimize drupal using mongo dbVladimir Ilic
 
MongoDB Launchpad 2016: What’s New in the 3.4 Server
MongoDB Launchpad 2016: What’s New in the 3.4 ServerMongoDB Launchpad 2016: What’s New in the 3.4 Server
MongoDB Launchpad 2016: What’s New in the 3.4 ServerMongoDB
 
MongoDB and Ruby on Rails
MongoDB and Ruby on RailsMongoDB and Ruby on Rails
MongoDB and Ruby on Railsrfischer20
 
High Performance Applications with MongoDB
High Performance Applications with MongoDBHigh Performance Applications with MongoDB
High Performance Applications with MongoDBMongoDB
 
Socialite, the Open Source Status Feed
Socialite, the Open Source Status FeedSocialite, the Open Source Status Feed
Socialite, the Open Source Status FeedMongoDB
 

Was ist angesagt? (19)

7 1 manual_deleter_v3_ricksdkfjskfj
7 1 manual_deleter_v3_ricksdkfjskfj7 1 manual_deleter_v3_ricksdkfjskfj
7 1 manual_deleter_v3_ricksdkfjskfj
 
Dealing with Azure Cosmos DB
Dealing with Azure Cosmos DBDealing with Azure Cosmos DB
Dealing with Azure Cosmos DB
 
Introduction to NOSQL And MongoDB
Introduction to NOSQL And MongoDBIntroduction to NOSQL And MongoDB
Introduction to NOSQL And MongoDB
 
Back to Basics: My First MongoDB Application
Back to Basics: My First MongoDB ApplicationBack to Basics: My First MongoDB Application
Back to Basics: My First MongoDB Application
 
Back to Basics Webinar 2: Your First MongoDB Application
Back to Basics Webinar 2: Your First MongoDB ApplicationBack to Basics Webinar 2: Your First MongoDB Application
Back to Basics Webinar 2: Your First MongoDB Application
 
Back to Basics Webinar 3: Schema Design Thinking in Documents
 Back to Basics Webinar 3: Schema Design Thinking in Documents Back to Basics Webinar 3: Schema Design Thinking in Documents
Back to Basics Webinar 3: Schema Design Thinking in Documents
 
MVP Cloud OS Week Track 1 9 Sept: Data liberty
MVP Cloud OS Week Track 1 9 Sept: Data libertyMVP Cloud OS Week Track 1 9 Sept: Data liberty
MVP Cloud OS Week Track 1 9 Sept: Data liberty
 
MongoDB Java Development - MongoBoston 2010
MongoDB Java Development - MongoBoston 2010MongoDB Java Development - MongoBoston 2010
MongoDB Java Development - MongoBoston 2010
 
ActiveRecord vs Mongoid
ActiveRecord vs MongoidActiveRecord vs Mongoid
ActiveRecord vs Mongoid
 
Mongo-Drupal
Mongo-DrupalMongo-Drupal
Mongo-Drupal
 
Using Mongoid with Ruby on Rails
Using Mongoid with Ruby on RailsUsing Mongoid with Ruby on Rails
Using Mongoid with Ruby on Rails
 
Building Your First MongoDB App ~ Metadata Catalog
Building Your First MongoDB App ~ Metadata CatalogBuilding Your First MongoDB App ~ Metadata Catalog
Building Your First MongoDB App ~ Metadata Catalog
 
Optimize drupal using mongo db
Optimize drupal using mongo dbOptimize drupal using mongo db
Optimize drupal using mongo db
 
An introduction to MongoDB
An introduction to MongoDBAn introduction to MongoDB
An introduction to MongoDB
 
MongoDB Launchpad 2016: What’s New in the 3.4 Server
MongoDB Launchpad 2016: What’s New in the 3.4 ServerMongoDB Launchpad 2016: What’s New in the 3.4 Server
MongoDB Launchpad 2016: What’s New in the 3.4 Server
 
MongoDB and Ruby on Rails
MongoDB and Ruby on RailsMongoDB and Ruby on Rails
MongoDB and Ruby on Rails
 
Python and MongoDB
Python and MongoDBPython and MongoDB
Python and MongoDB
 
High Performance Applications with MongoDB
High Performance Applications with MongoDBHigh Performance Applications with MongoDB
High Performance Applications with MongoDB
 
Socialite, the Open Source Status Feed
Socialite, the Open Source Status FeedSocialite, the Open Source Status Feed
Socialite, the Open Source Status Feed
 

Ähnlich wie MongoDB World 2018: Time for a Change Stream - Using MongoDB Change Streams to Version Your Database

Grokking TechTalk 9 - Building a realtime & offline editing service from scra...
Grokking TechTalk 9 - Building a realtime & offline editing service from scra...Grokking TechTalk 9 - Building a realtime & offline editing service from scra...
Grokking TechTalk 9 - Building a realtime & offline editing service from scra...Grokking VN
 
Eagle6 mongo dc revised
Eagle6 mongo dc revisedEagle6 mongo dc revised
Eagle6 mongo dc revisedMongoDB
 
Eagle6 Enterprise Situational Awareness
Eagle6 Enterprise Situational AwarenessEagle6 Enterprise Situational Awareness
Eagle6 Enterprise Situational AwarenessMongoDB
 
MongoDB Schema Design: Practical Applications and Implications
MongoDB Schema Design: Practical Applications and ImplicationsMongoDB Schema Design: Practical Applications and Implications
MongoDB Schema Design: Practical Applications and ImplicationsMongoDB
 
Grokking #9: Building a real-time and offline editing service with Couchbase
Grokking #9: Building a real-time and offline editing service with CouchbaseGrokking #9: Building a real-time and offline editing service with Couchbase
Grokking #9: Building a real-time and offline editing service with CouchbaseOliver N
 
A Brief MongoDB Intro
A Brief MongoDB IntroA Brief MongoDB Intro
A Brief MongoDB IntroScott Hernandez
 
Building Services With gRPC, Docker and Go
Building Services With gRPC, Docker and GoBuilding Services With gRPC, Docker and Go
Building Services With gRPC, Docker and GoMartin Kess
 
Api's and ember js
Api's and ember jsApi's and ember js
Api's and ember jsEdwin Cruz
 
Back to Basics 2017: MĂ­ primera aplicaciĂłn MongoDB
Back to Basics 2017: MĂ­ primera aplicaciĂłn MongoDBBack to Basics 2017: MĂ­ primera aplicaciĂłn MongoDB
Back to Basics 2017: MĂ­ primera aplicaciĂłn MongoDBMongoDB
 
Document Validation in MongoDB 3.2
Document Validation in MongoDB 3.2Document Validation in MongoDB 3.2
Document Validation in MongoDB 3.2MongoDB
 
"Real-time Collaborative Text Editing on Grammarly’s Front-End Team" Oleksii...
 "Real-time Collaborative Text Editing on Grammarly’s Front-End Team" Oleksii... "Real-time Collaborative Text Editing on Grammarly’s Front-End Team" Oleksii...
"Real-time Collaborative Text Editing on Grammarly’s Front-End Team" Oleksii...Fwdays
 
MongoDB.local Austin 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch A...
MongoDB.local Austin 2018:  Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch A...MongoDB.local Austin 2018:  Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch A...
MongoDB.local Austin 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch A...MongoDB
 
Mongoose and MongoDB 101
Mongoose and MongoDB 101Mongoose and MongoDB 101
Mongoose and MongoDB 101Will Button
 
Insight on MongoDB Change Stream - Abhishek.D, Mydbops Team
Insight on MongoDB Change Stream - Abhishek.D, Mydbops TeamInsight on MongoDB Change Stream - Abhishek.D, Mydbops Team
Insight on MongoDB Change Stream - Abhishek.D, Mydbops TeamMydbops
 
Keynote - Speaker: Grigori Melnik
Keynote - Speaker: Grigori Melnik Keynote - Speaker: Grigori Melnik
Keynote - Speaker: Grigori Melnik MongoDB
 
Building your first app with MongoDB
Building your first app with MongoDBBuilding your first app with MongoDB
Building your first app with MongoDBNorberto Leite
 
MongoDB Stitch Introduction
MongoDB Stitch IntroductionMongoDB Stitch Introduction
MongoDB Stitch IntroductionMongoDB
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responsesdarrelmiller71
 
Java/Scala Lab: Đ‘ĐŸŃ€ĐžŃ ĐąŃ€ĐŸŃ„ĐžĐŒĐŸĐČ - ĐžĐ±Đ¶ĐžĐłĐ°ŃŽŃ‰Đ°Ń Big Data.
Java/Scala Lab: Đ‘ĐŸŃ€ĐžŃ ĐąŃ€ĐŸŃ„ĐžĐŒĐŸĐČ - ĐžĐ±Đ¶ĐžĐłĐ°ŃŽŃ‰Đ°Ń Big Data.Java/Scala Lab: Đ‘ĐŸŃ€ĐžŃ ĐąŃ€ĐŸŃ„ĐžĐŒĐŸĐČ - ĐžĐ±Đ¶ĐžĐłĐ°ŃŽŃ‰Đ°Ń Big Data.
Java/Scala Lab: Đ‘ĐŸŃ€ĐžŃ ĐąŃ€ĐŸŃ„ĐžĐŒĐŸĐČ - ĐžĐ±Đ¶ĐžĐłĐ°ŃŽŃ‰Đ°Ń Big Data.GeeksLab Odessa
 
Tugdual Grall - From SQL to NoSQL in less than 40 min - NoSQL matters Paris 2015
Tugdual Grall - From SQL to NoSQL in less than 40 min - NoSQL matters Paris 2015Tugdual Grall - From SQL to NoSQL in less than 40 min - NoSQL matters Paris 2015
Tugdual Grall - From SQL to NoSQL in less than 40 min - NoSQL matters Paris 2015NoSQLmatters
 

Ähnlich wie MongoDB World 2018: Time for a Change Stream - Using MongoDB Change Streams to Version Your Database (20)

Grokking TechTalk 9 - Building a realtime & offline editing service from scra...
Grokking TechTalk 9 - Building a realtime & offline editing service from scra...Grokking TechTalk 9 - Building a realtime & offline editing service from scra...
Grokking TechTalk 9 - Building a realtime & offline editing service from scra...
 
Eagle6 mongo dc revised
Eagle6 mongo dc revisedEagle6 mongo dc revised
Eagle6 mongo dc revised
 
Eagle6 Enterprise Situational Awareness
Eagle6 Enterprise Situational AwarenessEagle6 Enterprise Situational Awareness
Eagle6 Enterprise Situational Awareness
 
MongoDB Schema Design: Practical Applications and Implications
MongoDB Schema Design: Practical Applications and ImplicationsMongoDB Schema Design: Practical Applications and Implications
MongoDB Schema Design: Practical Applications and Implications
 
Grokking #9: Building a real-time and offline editing service with Couchbase
Grokking #9: Building a real-time and offline editing service with CouchbaseGrokking #9: Building a real-time and offline editing service with Couchbase
Grokking #9: Building a real-time and offline editing service with Couchbase
 
A Brief MongoDB Intro
A Brief MongoDB IntroA Brief MongoDB Intro
A Brief MongoDB Intro
 
Building Services With gRPC, Docker and Go
Building Services With gRPC, Docker and GoBuilding Services With gRPC, Docker and Go
Building Services With gRPC, Docker and Go
 
Api's and ember js
Api's and ember jsApi's and ember js
Api's and ember js
 
Back to Basics 2017: MĂ­ primera aplicaciĂłn MongoDB
Back to Basics 2017: MĂ­ primera aplicaciĂłn MongoDBBack to Basics 2017: MĂ­ primera aplicaciĂłn MongoDB
Back to Basics 2017: MĂ­ primera aplicaciĂłn MongoDB
 
Document Validation in MongoDB 3.2
Document Validation in MongoDB 3.2Document Validation in MongoDB 3.2
Document Validation in MongoDB 3.2
 
"Real-time Collaborative Text Editing on Grammarly’s Front-End Team" Oleksii...
 "Real-time Collaborative Text Editing on Grammarly’s Front-End Team" Oleksii... "Real-time Collaborative Text Editing on Grammarly’s Front-End Team" Oleksii...
"Real-time Collaborative Text Editing on Grammarly’s Front-End Team" Oleksii...
 
MongoDB.local Austin 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch A...
MongoDB.local Austin 2018:  Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch A...MongoDB.local Austin 2018:  Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch A...
MongoDB.local Austin 2018: Ch-Ch-Ch-Ch-Changes: Taking Your MongoDB Stitch A...
 
Mongoose and MongoDB 101
Mongoose and MongoDB 101Mongoose and MongoDB 101
Mongoose and MongoDB 101
 
Insight on MongoDB Change Stream - Abhishek.D, Mydbops Team
Insight on MongoDB Change Stream - Abhishek.D, Mydbops TeamInsight on MongoDB Change Stream - Abhishek.D, Mydbops Team
Insight on MongoDB Change Stream - Abhishek.D, Mydbops Team
 
Keynote - Speaker: Grigori Melnik
Keynote - Speaker: Grigori Melnik Keynote - Speaker: Grigori Melnik
Keynote - Speaker: Grigori Melnik
 
Building your first app with MongoDB
Building your first app with MongoDBBuilding your first app with MongoDB
Building your first app with MongoDB
 
MongoDB Stitch Introduction
MongoDB Stitch IntroductionMongoDB Stitch Introduction
MongoDB Stitch Introduction
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responses
 
Java/Scala Lab: Đ‘ĐŸŃ€ĐžŃ ĐąŃ€ĐŸŃ„ĐžĐŒĐŸĐČ - ĐžĐ±Đ¶ĐžĐłĐ°ŃŽŃ‰Đ°Ń Big Data.
Java/Scala Lab: Đ‘ĐŸŃ€ĐžŃ ĐąŃ€ĐŸŃ„ĐžĐŒĐŸĐČ - ĐžĐ±Đ¶ĐžĐłĐ°ŃŽŃ‰Đ°Ń Big Data.Java/Scala Lab: Đ‘ĐŸŃ€ĐžŃ ĐąŃ€ĐŸŃ„ĐžĐŒĐŸĐČ - ĐžĐ±Đ¶ĐžĐłĐ°ŃŽŃ‰Đ°Ń Big Data.
Java/Scala Lab: Đ‘ĐŸŃ€ĐžŃ ĐąŃ€ĐŸŃ„ĐžĐŒĐŸĐČ - ĐžĐ±Đ¶ĐžĐłĐ°ŃŽŃ‰Đ°Ń Big Data.
 
Tugdual Grall - From SQL to NoSQL in less than 40 min - NoSQL matters Paris 2015
Tugdual Grall - From SQL to NoSQL in less than 40 min - NoSQL matters Paris 2015Tugdual Grall - From SQL to NoSQL in less than 40 min - NoSQL matters Paris 2015
Tugdual Grall - From SQL to NoSQL in less than 40 min - NoSQL matters Paris 2015
 

Mehr von MongoDB

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump StartMongoDB
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB
 

Mehr von MongoDB (20)

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
 

KĂŒrzlich hochgeladen

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Christopher Logan Kennedy
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 

KĂŒrzlich hochgeladen (20)

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 

MongoDB World 2018: Time for a Change Stream - Using MongoDB Change Streams to Version Your Database

  • 1. Time for a Change Stream By Leigha Mitchell & Edward Robinson @LeighaNotLeia @earobinson
  • 2. Change streams and using them to version your data
  • 3.
  • 4. The hubba stack ● MEANR - Mongo, Express, Angular, Node, React ● Many Services (Payments, Products, Users, etc) ● Three Engineering teams (one Python, two JS) ● AWS, GCP, MongoDB Atlas, RabbitMQ, Redis, etc ● Mongoose, Mongo Native Driver
  • 5. What is a change stream? Change streams allow applications to access real- time data changes without the complexity and risk of tailing the oplog. Applications can use change streams to subscribe to all data changes on a collection and immediately react to them. -- https://docs.mongodb.com/manual/changeStrea ms/
  • 6. Why are we here? Hubba ● 6 year old company ● Networking for Brands and Buyers ● Microservices ● Decided to launch ordering
  • 7. The exact product you ordered must be delivered to you Ordering must haves This Not this
  • 8. What exactly is a version? A particular form of something differing in certain respects from an earlier form or other forms of the same type of thing. -- https://www.google.com?q=define+version
  • 9. 1. Options ➔ Not versioning Previously wasn’t needed, continue to not us this ➔ Make copy How do we know what to copy? ➔ In-app versioning Lean into Mongoose and version the app ➔ Oplog versioning Write new service to consume the oplog
  • 10. Not versioning Would have locked orderable products
  • 11. Make a copy Knowing what to copy is hard
  • 12. In-app Versioning Works great, if you’re building from scratch
  • 14. Denormalization: Denormalization allows you to avoid some application- level joins, at the expense of having more complex and expensive updates. Denormalizing one or more fields makes sense if those fields are read much more often than they are updated. -- https://www.mongodb.com/blog/post/6-rules-of- thumb-for-mongodb-schema-design-part-3
  • 15. Denormalization Example - Pre bearer of the ring Users / Hobbits { _id : 1, name : Frodo, occupation: unemployed }, { _id : 2, name : Sam, occupation: unemployed }, Messages { _id : 93, from : 2, to: 1, fromOccupation: unemployed, toOccupation: unemployed, message: What do you call a hobbit party? }, { _id : 94, from : 1, to: 2, fromOccupation: unemployed, toOccupation: unemployed, message: A little get together. }
  • 16. Denormalization Example - Post bearer of the ring Users / Hobbits { _id : 1, name : Frodo, occupation: Bearer of the ring }, { _id : 2, name : Sam, occupation: Protector of Frodo }, Messages { _id : 93, from : 2, to: 1, fromOccupation: Protector of Frodo, toOccupation: Bearer of the ring, message: What do you call a hobbit party? }, { _id : 94, from : 1, to: 2, fromOccupation: Bearer of the ring, toOccupation: Protector of Frodo, message: A little get together. } message.update({to: ObjectId: 1}, {$set: {toOccupation: Bearer of the ring}}, {multi: true})
  • 18. So what did we choose?
  • 19. So what did we choose? None of them!
  • 20. Along comes: MongoDB 3.6 Now with Change Streams!
  • 21. 2. Why Mongo 3.6 ➔ Easy Versioning Ability to do versioning without significant architecture changes ➔ Raw Queries Allowed us to use existing raw queries without altering to support versioning ➔ Many Sources No front-end data consumers did not need to be altered
  • 23. Creating a Product Website Products Service MongoDB History Service Create Version 0 Create Version 0 Create Version 0 Created Version 0 Created Version 0
  • 24. Ordering a Product Website Orders Service History Service MongoDB Order Version 0 Order Version 0 Order Version 0 Yes You Can! Ordered Version 0
  • 25. But what about the raw queries??
  • 26. But what about the raw queries?? The version numbers are Human Readable : SHA 42:c3f42aeb1c3d85b5a1594a5d0a727fcdf58a33ac
  • 27. But what about the raw queries?? The version numbers are Human Readable : SHA 42:c3f42aeb1c3d85b5a1594a5d0a727fcdf58a33ac
  • 28. But what about the raw queries?? The version numbers are Human Readable : SHA 42:c3f42aeb1c3d85b5a1594a5d0a727fcdf58a33ac
  • 29. Autonomy of a Change Stream { _id : { <BSON Object> }, “operationType” : “<operation>“, “fullDocument” : { <document> }, “ns” : { “db” : “<database>“, “coll” : “<collection” }, “documentKey” : { “_id” : <ObjectId> }, “updateDescription” : { “updatedFields” : { <document> }, “removedFields” : [ “<field>“, ... ] } }
  • 30. Autonomy of a Change Stream { _id : { <BSON Object> }, “operationType” : “<operation>“, “fullDocument” : { <document> }, “ns” : { “db” : “<database>“, “coll” : “<collection” }, “documentKey” : { “_id” : <ObjectId> }, “updateDescription” : { “updatedFields” : { <document> }, “removedFields” : [ “<field>“, ... ] } } Insert Delete Update Replace Invalidate
  • 31. Autonomy of a Change Stream { _id : { <BSON Object> }, “operationType” : “<operation>“, “fullDocument” : { <document> }, “ns” : { “db” : “<database>“, “coll” : “<collection” }, “documentKey” : { “_id” : <ObjectId> }, “updateDescription” : { “updatedFields” : { <document> }, “removedFields” : [ “<field>“, ... ] } }
  • 32. Autonomy of a Change Stream { _id : { <BSON Object> }, “operationType” : “<operation>“, “fullDocument” : { <document> }, “ns” : { “db” : “<database>“, “coll” : “<collection>” }, “documentKey” : { “_id” : <ObjectId> }, “updateDescription” : { “updatedFields” : { <document> }, “removedFields” : [ “<field>“, ... ] } }
  • 33. Autonomy of a Change Stream { _id : { <BSON Object> }, “operationType” : “<operation>“, “fullDocument” : { <document> }, “ns” : { “db” : “<database>“, “coll” : “<collection” }, “documentKey” : { “_id” : <ObjectId> }, “updateDescription” : { “updatedFields” : { <document> }, “removedFields” : [ “<field>“, ... ] } }
  • 34. Autonomy of a Change Stream { _id : { <BSON Object> }, “operationType” : “<operation>“, “fullDocument” : { <document> }, “ns” : { “db” : “<database>“, “coll” : “<collection” }, “documentKey” : { “_id” : <ObjectId> }, “updateDescription” : { “updatedFields” : { <document> }, “removedFields” : [ “<field>“, ... ] } }
  • 36. Insert a message Mongo Query db.getCollection('messages').insert({from: 2, to: 1, fromOccupation: 'unemployed', toOccupation: 'unemployed', message: 'What do you call a habbit party?', version: 0}) Document { "_id" : ObjectId("5b0b6c7adce137d2655f7efe"), "from" : 2, "to" : 1, "fromOccupation" : "unemployed", "toOccupation" : "unemployed", "message" : "What do you call a habbit party?", "version" : 0 } Change Stream { "_id":{ "_data":"glsLbHoAAAABRmRfaWQAZFsLbHrc 4TfSZV9+/gBaEASgyrHmfadIaLKbJfTNB8BgB A==" }, "operationType":"insert", "fullDocument":{...}, "ns":{ "db":"hubba", "coll":"messages" }, "documentKey":{ "_id":"5b0b6c7adce137d2655f7efe" }
  • 38. Update a message Mongo Query db.getCollection('messages').update({_id: ObjectId("5b0b6c7adce137d2655f7efe")}, {$set: {version: 1, message : "What do you call a hobbit party?"}}) Document { "_id" : ObjectId("5b0b6c7adce137d2655f7efe"), "from" : 2, "to" : 1, "fromOccupation" : "unemployed", "toOccupation" : "unemployed", "message" : "What do you call a hobbit party?", "version" : 1 } Change Stream { "_id": {
}, "operationType":"update", "fullDocument":{...}, "Ns":{"db":"hubba","coll":"messages"}, "documentKey": {... }, "updateDescription":{ "updatedFields":{ "message":"What do you call a hobbit party?", "version":1 }, "removedFields":{} } }
  • 40. Implementation - Proof of concept - Used full document to consume all changes from Mongo and write them to our DB - Successfully mirrored actual documents
  • 41. Gotcha #1 Principle of eventual consistency - Full document wouldn’t always represent the document that existed in the DB Lesson: If you’re using change streams for event sourcing, you can source attributes out of the update description, but not out of the full document
  • 42. Solution: Be more like a database Change Streams are guaranteed to be delivered in the order that the change happens. Source the events as they happen, and apply update description to the previous version
  • 43. Gotcha #2 How do we Bootstrap versions into DB - With lack of insert events for all records, how do we get them into the DB?
  • 44. Solution: Use full document If we can’t find a previous event, just use full document
  • 45. Gotcha #3 How do you ensure you record each write only once?
  • 46. Solution: Change streams guarantee that each change will be delivered in order once and only once.
  • 47. Gotcha #4 Large documents can cause issues
  • 48. Solution: Don’t do it. Seriously we don’t. 16Mb is a lot of data!
  • 49. Gotcha #5 We fell off the Oplog If your oplog can hold 100 documents, and I fill it up with messages, you will not be able to resume the products change stream
  • 50. Solution: We got a bigger oplog and update our versioned collections We build a script to run every hour and randomly update one of the documents in every versioned collection
  • 51. Cons ➔ Histories has no context Histories is unable to validate the data it gets, its just a blind data store ➔ Spinning up a whole service We could have solved this with in app versioning, now we maintain an extra service ➔ Issues upgrading We had a few road bumps with performance when we first released mongo 3.6 + the new drivers
  • 52. Benefits ➔ Histories is isolated As long as our data is persisted we have a history of it ➔ We get to keep our raw queries Our denormalization strategies continue to work ➔ Language support We do not need to implement a history support for every language we use, just a version generator, if we want access.
  • 54. Conclusion: 1. Change streams are a great way to follow updates to your documents 2. Using change streams for event sourcing would be amazing 3. If you are versioning data in a legacy app, change streams may be for you
  • 55. Demo

Hinweis der Redaktion

  1. L: Introductions to who we are My name is Leigha, I am a developer at hubba, this is Edward, also a developer at hubba
  2. L: This presentation will be about mongo change streams, and how we use them at hubba to version our data
  3. L
  4. L
  5. ED: Change streams where introduced in mongo 3.6, they are a replacement for using the oplog to subscribe to changes to your documents in your database they can be used for all sorts of fancy things. At hubba we currently use them to version our data, but would like to use them for event sourcing moving forward Better explaination about change streams Explain the oplog
  6. L: Explain Hubba in terms of buyers and brands, introducing ordering We need to focus more on hubba and why its important
  7. L: The key part of this is that the exact product you ordered must be delivered to you, so when the product description changes, we need to know that the description changed, and capture that in our system.
  8. ED: A version is a reference to a particular form of something, this makes versioning the act of creating those references to a particular form of something. As developers we all use versioning every day, every time you use git, push a release or install a package.
  9. L: We learned about the oplog last time at mongo world Before this, what is versioning
  10. L: Maybe not the best user experience
  11. ED: When you land on a page to order a product, that product can change before the user adds it to the card
  12. L: Different teams, using different ORMs, raw mongo queries
  13. L: Different teams, using different ORMs, raw mongo queries
  14. Leigha: Help us make this slide better!!!!!!!!!!!! Explain Raw mongo queries Highlight keywords here!
  15. L:
  16. L:
  17. ED: We learned about a few people using the oplog for event sourcing and version last year at mongo world! Mongo DB world Rolled back
  18. L:
  19. L:
  20. L: we were on Mongo 3.4 at the time
  21. L:
  22. ED: Our Changestream design Explain architecture Explain process of adding product to your cart
  23. ED:6 fields update
  24. ED:6 fields
  25. L: Show an example of a version number Show an example of incrementing the version number
  26. L: Show an example of a version number Show an example of incrementing the version number We need to explain this better! (I need to set up this up better)
  27. L: Show an example of a version number Show an example of incrementing the version number We need to explain this better! (I need to set up this up better)
  28. L: Show an example of a version number Show an example of incrementing the version number We need to explain this better! (I need to set up this up better)
  29. ED:6 fields
  30. Delete Explain invalidate better (we dont do it, this happens when a collection is dropped)
  31. Highlight the info
  32. E
  33. ED
  34. L: This happens when a document is updated very quickly many times. This is because Change streams can be configured to only send when the document is durable, however the full document only comes from a node in your cluster Explain more, how it affected our user History service would corrupt documents because it would overlap
  35. Quarem
  36. There’s previous data, since we can’t rely on the insert events for this older data because it doesn’t have them, how are we going to get this data into our shiny new History collection? Explain more, how did it effect us, implications
  37. E: How did bootstraping affect us
  38. But how are we sure that it’s only going to write once and in order?
  39. But what are the chances that the documents will be too large and cause issues?
  40. Example of our large document solution Phrase this as it’s super unlikely because you have so much space
  41. ED
  42. L
  43. ED
  44. ED
  45. Leigha