MongoDB Mobile
Bringing the Power of MongoDB to Your Device
This presentation contains “forward-looking statements” within the meaning of Section 27A of the Securities Act of 1933,
as amended, and Section 21E of the Securities Exchange Act of 1934, as amended. Such forward-looking statements are
subject to a number of risks, uncertainties, assumptions and other factors that could cause actual results and the timing of
certain events to differ materially from future results expressed or implied by the forward-looking statements. Factors that
could cause or contribute to such differences include, but are not limited to, those identified our filings with the Securities
and Exchange Commission. You should not rely upon forward-looking statements as predictions of future events.
Furthermore, such forward-looking statements speak only as of the date of this presentation.
In particular, the development, release, and timing of any features or functionality described for MongoDB products
remains at MongoDB’s sole discretion. This information is merely intended to outline our general product direction and it
should not be relied on in making a purchasing decision nor is this a commitment, promise or legal obligation to deliver
any material, code, or functionality. Except as required by law, we undertake no obligation to update any forward-looking
statements to reflect events or circumstances after the date of such statements.
Safe Harbor Statement
Matt Lord
Senior Product Manager
@mattalord
We've Come a Long Way
Mobile is becoming not only the new
digital hub, but also the bridge to the
physical world. That’s why mobile will
affect more than just your digital
operations — it will transform your
entire business.
Thomas Husson, Vice President and Principal
Analyst at Forrester Research
Mobile
Is Transforming Everything
A Complete Data Platform
Geographically distributed backend services
• MongoDB Atlas
• Point and click active/active global clusters
• Effortless HA, DR, and low-latency access
• MongoDB Stitch, Serverless Platform
• Automatic scaling based on request volume
• Stitch Query Anywhere
• Stitch Functions
• Stitch Triggers
• Stitch Mobile Sync (coming soon)
Geographically distributed frontend services
• MongoDB Mobile
• IoT and edge devices
• iOS and Android apps
• Supporting local offline storage
Stitch provides a seamless bridge between them
MongoDB Mobile
The Full Stack
Your Mobile Application
• iOS and Android devices
• Leveraging the power of MongoDB everywhere
• Allowing you to focus on building your GREAT THING
MongoDB Stitch SDK
• Access to MongoDB Stitch services from Android and iOS
• New Stitch Interfaces for on-device (local) storage
• Synchronization between local and remote
MongoDB Mobile Drivers
• Swift for iOS, Java for Android
• Existing drivers, extended to support local storage
MongoDB Mobile Database
• A lite version of MongoDB as a library
• C language interface to the library
• Fully passive, no background threads or tasks
MongoDB Mobile Storage Engine
• K/V storage on top of SQLite
• Very small disk footprint and minimal memory usage
• Energy efficient
Platform Details
Operating System OS Details CPUs Devices
iOS, tvOS 10.2+ ARM64
x86_64 (simulators)
Apple, Inc.
Android 7.0/Nougat+ x86_64
armeabi-v7a
arm64-v8a
Any vendor
(by ABI)
Linux TBD x86_64 Any vendor
macOS 10.10+ x86_64 Apple, Inc.
The Full Stack
Stitch SDK
Packages the entire mobile stack together
Stitches the frontend and backend together
• End-to-end Mobile SDK
• API for local storage
• API for remote Stitch service invocation
• API for syncing between local and remote
• Provides a transparent bridge for applications
iOS SDK: https://github.com/mongodb/stitch-ios-sdk/
Android SDK: https://github.com/mongodb/stitch-android-sdk/
final StitchAppClient client = Stitch.getDefaultAppClient();
final MongoClient mongoClient =
client.getServiceClient(LocalMongoDbService.ClientFactory);
MongoCollection<Document> items =
mongoClient.getDatabase(TodoItem.TODO_LIST_DATABASE).getCollection(TodoItem.T
ODO_LIST_COLLECTION);
public void updateChecked(final ObjectId itemId, final boolean isChecked) {
final Document updateDoc = new Document("$set", new
Document(TodoItem.CHECKED_KEY, isChecked));
if (isChecked) {
updateDoc.append("$currentDate", new Document(TodoItem.DONE_DATE_KEY,
true));
} else {
updateDoc.append("$unset", new Document(TodoItem.DONE_DATE_KEY, ""));
}
items.updateOne(new Document(TodoItem.ID_KEY, itemId), updateDoc);
...
}
private List<TodoItem> getItems() {
final ArrayList<TodoItem> todoItems = new ArrayList<>();
for (final Document doc : items.find()) {
if (TodoItem.isTodoItem(doc)) {
final TodoItem item = new TodoItem(doc);
todoItems.add(item);
}
}
return todoItems;
}
The Full Stack
Mobile Drivers
Existing drivers for the given language
• With a few extensions
• Open a local storage instance
• Close a local storage instance
• Support today for Swift, Java, and C
• Others created based on demand
Can be tested directly
• Swift: https://github.com/mongodb/swift-mongo-mobile/
• Java:
http://central.maven.org/maven2/org/mongodb/mongodb-
driver-embedded/
import MongoMobile
…
let client = MongoMobile.create(settings: MongoClientSettings [ dbPath:
"test-path" ])
let coll = try client.db("test").collection("foo")
let insertResult = try coll.insertOne([ "test": 42 ])
let findResult = try coll.find([ "_id": insertResult!.insertedId ])
let docs = Array(findResult)
…
The Full Stack
Mobile Database
Lite version of MongoDB formed into a library
• C ABI
• Auth, Replication, Sharding, etc. removed
• Supports only the mobile storage engine
• Passive: no background threads
• Light: disk, memory, energy
C Interface
• Low level
• Drivers are extended to invoke it
Availability
• Builds out of MongoDB 4.0+ community tree
• Pre-built binary packages for mobile targets
auto lib = mongo_embedded_v1_lib_init (&params, status);
auto instance = mongo_embedded_v1_instance_create (lib,
params.yaml_config, status);
client = mongo_embedded_v1_mongoc_client_create (instance);
collection = mongoc_client_get_collection (client, "iot_test",
"sensor_data");
insert = bson_new ();
BSON_APPEND_UTF8 (insert, "message", "Hey there!");
BSON_APPEND_UTF8 (insert, "from", "Matt Lord);
mongoc_collection_insert_one (collection, insert, NULL, NULL, &error);
query = bson_new ();
cursor = mongoc_collection_find_with_opts (collection, query, NULL,
NULL);
while (mongoc_cursor_next(cursor, &doc)) {
str = bson_as_canonical_extended_json (doc, NULL);
printf ("%sn", str);
bson_free (str);
}
* Complete example
The Full Stack
Mobile Storage Engine
Leverages SQLite as a K/V store
• Maintaining full MongoDB Query Language support
• Single SQLite database called “mobile”
• Table names follow the WiredTiger filesystem / dictionary
naming convention
• Every entity you create
• database, collection, index, …
Can be tested with standard MongoDB
./buildscripts/scons.py mongod --mobile-se=on
./build/opt/mongo/mongod --storageEngine=mobile
sqlite> .database
main: /.../mobile.sqlite
sqlite> .tables
_mdb_catalog index-1-1419396644176400596
collection-0-1419396644176400596 index-1-9204882299253173129
collection-0-9204882299253173129
sqlite> select sql from sqlite_master where name='collection-0-
9204882299253173129';
CREATE TABLE "collection-0-6881873531296038739"(rec_id INT, data
BLOB, PRIMARY KEY(rec_id))
sqlite> select sql from sqlite_master where name='index-1-
9204882299253173129';
CREATE TABLE "index-1-9204882299253173129"(key BLOB PRIMARY
KEY, value BLOB)
sqlite> select * from `collection-0-9204882299253173129`;
rec_id data
---------- ----------
1 2
What’s Next
Stitch Mobile Sync
Example Setup
Steps for Sync
1. Define Sync + Conflict Handlers on a collection
2. Specify Documents to be synced
3. Application manages local documents
4. Stitch then syncs state with the backend automatically
• Bi-directional synchronization
// Initialize your application, then configure Synced collections
Stitch.initializeDefaultAppClient('<your-app-id>').then(() => {
tripsColl.configureSync(trip_conflict, trip_change, trip_error);
...
});
// Find all trips that should be synced and ensure they’re synced
tripsColl.find({user: stitch.}).toArray().then(trips =>{
tripsColl.syncMany(trips)
});
...
tripsColl.sync().update({trip_id:currTripId},{meal_choice:
selectedMeal});
...
Coming Soon!
Stitch Mobile Sync
Example Usage
Stitch syncs data when online on a per operation basis
Uses 3 client-side event responders
• ChangeListener
• ConflictHandler
• ErrorListener
Defined Handlers receive all local/remote changes
// On changes to the remote document the trip_change handler is
called
function trip_change(changeEvent){
...
if(updatedFields.keys().includes(“Gate”)){
setStatusBarUpdate(“Gate Changed”, tripID, gate);
}
...
}
// On a conflict, the trip_conflict handler is called
function trip_conflict(localDoc, remoteDoc){
newStatus = remoteDoc;
for(key in remoteDoc.keys()){
if(localDoc[key] != remoteDoc[key] &&
isLocalPreferred(key)){
newStatus[key] = localDoc[key]
}
}
// Returning a document from the handler will attempt to write it
return newStatus;
};
Coming Soon!
Licensing,
Pricing, and
Support
Subject to Change
Roadmap
Subject to Change
Into the
Future…
Source: Star Wars Tales: Into the Great Unknown (2004) (Dark Horse Comics)
Thank You!
MongoDB Mobile: Bringing the Power of MongoDB to Your Device

MongoDB Mobile: Bringing the Power of MongoDB to Your Device

  • 1.
    MongoDB Mobile Bringing thePower of MongoDB to Your Device
  • 2.
    This presentation contains“forward-looking statements” within the meaning of Section 27A of the Securities Act of 1933, as amended, and Section 21E of the Securities Exchange Act of 1934, as amended. Such forward-looking statements are subject to a number of risks, uncertainties, assumptions and other factors that could cause actual results and the timing of certain events to differ materially from future results expressed or implied by the forward-looking statements. Factors that could cause or contribute to such differences include, but are not limited to, those identified our filings with the Securities and Exchange Commission. You should not rely upon forward-looking statements as predictions of future events. Furthermore, such forward-looking statements speak only as of the date of this presentation. In particular, the development, release, and timing of any features or functionality described for MongoDB products remains at MongoDB’s sole discretion. This information is merely intended to outline our general product direction and it should not be relied on in making a purchasing decision nor is this a commitment, promise or legal obligation to deliver any material, code, or functionality. Except as required by law, we undertake no obligation to update any forward-looking statements to reflect events or circumstances after the date of such statements. Safe Harbor Statement
  • 3.
    Matt Lord Senior ProductManager @mattalord
  • 4.
    We've Come aLong Way
  • 5.
    Mobile is becomingnot only the new digital hub, but also the bridge to the physical world. That’s why mobile will affect more than just your digital operations — it will transform your entire business. Thomas Husson, Vice President and Principal Analyst at Forrester Research Mobile Is Transforming Everything
  • 6.
    A Complete DataPlatform Geographically distributed backend services • MongoDB Atlas • Point and click active/active global clusters • Effortless HA, DR, and low-latency access • MongoDB Stitch, Serverless Platform • Automatic scaling based on request volume • Stitch Query Anywhere • Stitch Functions • Stitch Triggers • Stitch Mobile Sync (coming soon) Geographically distributed frontend services • MongoDB Mobile • IoT and edge devices • iOS and Android apps • Supporting local offline storage Stitch provides a seamless bridge between them
  • 7.
  • 8.
    The Full Stack YourMobile Application • iOS and Android devices • Leveraging the power of MongoDB everywhere • Allowing you to focus on building your GREAT THING MongoDB Stitch SDK • Access to MongoDB Stitch services from Android and iOS • New Stitch Interfaces for on-device (local) storage • Synchronization between local and remote MongoDB Mobile Drivers • Swift for iOS, Java for Android • Existing drivers, extended to support local storage MongoDB Mobile Database • A lite version of MongoDB as a library • C language interface to the library • Fully passive, no background threads or tasks MongoDB Mobile Storage Engine • K/V storage on top of SQLite • Very small disk footprint and minimal memory usage • Energy efficient
  • 9.
    Platform Details Operating SystemOS Details CPUs Devices iOS, tvOS 10.2+ ARM64 x86_64 (simulators) Apple, Inc. Android 7.0/Nougat+ x86_64 armeabi-v7a arm64-v8a Any vendor (by ABI) Linux TBD x86_64 Any vendor macOS 10.10+ x86_64 Apple, Inc.
  • 10.
    The Full Stack StitchSDK Packages the entire mobile stack together Stitches the frontend and backend together • End-to-end Mobile SDK • API for local storage • API for remote Stitch service invocation • API for syncing between local and remote • Provides a transparent bridge for applications iOS SDK: https://github.com/mongodb/stitch-ios-sdk/ Android SDK: https://github.com/mongodb/stitch-android-sdk/ final StitchAppClient client = Stitch.getDefaultAppClient(); final MongoClient mongoClient = client.getServiceClient(LocalMongoDbService.ClientFactory); MongoCollection<Document> items = mongoClient.getDatabase(TodoItem.TODO_LIST_DATABASE).getCollection(TodoItem.T ODO_LIST_COLLECTION); public void updateChecked(final ObjectId itemId, final boolean isChecked) { final Document updateDoc = new Document("$set", new Document(TodoItem.CHECKED_KEY, isChecked)); if (isChecked) { updateDoc.append("$currentDate", new Document(TodoItem.DONE_DATE_KEY, true)); } else { updateDoc.append("$unset", new Document(TodoItem.DONE_DATE_KEY, "")); } items.updateOne(new Document(TodoItem.ID_KEY, itemId), updateDoc); ... } private List<TodoItem> getItems() { final ArrayList<TodoItem> todoItems = new ArrayList<>(); for (final Document doc : items.find()) { if (TodoItem.isTodoItem(doc)) { final TodoItem item = new TodoItem(doc); todoItems.add(item); } } return todoItems; }
  • 11.
    The Full Stack MobileDrivers Existing drivers for the given language • With a few extensions • Open a local storage instance • Close a local storage instance • Support today for Swift, Java, and C • Others created based on demand Can be tested directly • Swift: https://github.com/mongodb/swift-mongo-mobile/ • Java: http://central.maven.org/maven2/org/mongodb/mongodb- driver-embedded/ import MongoMobile … let client = MongoMobile.create(settings: MongoClientSettings [ dbPath: "test-path" ]) let coll = try client.db("test").collection("foo") let insertResult = try coll.insertOne([ "test": 42 ]) let findResult = try coll.find([ "_id": insertResult!.insertedId ]) let docs = Array(findResult) …
  • 12.
    The Full Stack MobileDatabase Lite version of MongoDB formed into a library • C ABI • Auth, Replication, Sharding, etc. removed • Supports only the mobile storage engine • Passive: no background threads • Light: disk, memory, energy C Interface • Low level • Drivers are extended to invoke it Availability • Builds out of MongoDB 4.0+ community tree • Pre-built binary packages for mobile targets auto lib = mongo_embedded_v1_lib_init (&params, status); auto instance = mongo_embedded_v1_instance_create (lib, params.yaml_config, status); client = mongo_embedded_v1_mongoc_client_create (instance); collection = mongoc_client_get_collection (client, "iot_test", "sensor_data"); insert = bson_new (); BSON_APPEND_UTF8 (insert, "message", "Hey there!"); BSON_APPEND_UTF8 (insert, "from", "Matt Lord); mongoc_collection_insert_one (collection, insert, NULL, NULL, &error); query = bson_new (); cursor = mongoc_collection_find_with_opts (collection, query, NULL, NULL); while (mongoc_cursor_next(cursor, &doc)) { str = bson_as_canonical_extended_json (doc, NULL); printf ("%sn", str); bson_free (str); } * Complete example
  • 13.
    The Full Stack MobileStorage Engine Leverages SQLite as a K/V store • Maintaining full MongoDB Query Language support • Single SQLite database called “mobile” • Table names follow the WiredTiger filesystem / dictionary naming convention • Every entity you create • database, collection, index, … Can be tested with standard MongoDB ./buildscripts/scons.py mongod --mobile-se=on ./build/opt/mongo/mongod --storageEngine=mobile sqlite> .database main: /.../mobile.sqlite sqlite> .tables _mdb_catalog index-1-1419396644176400596 collection-0-1419396644176400596 index-1-9204882299253173129 collection-0-9204882299253173129 sqlite> select sql from sqlite_master where name='collection-0- 9204882299253173129'; CREATE TABLE "collection-0-6881873531296038739"(rec_id INT, data BLOB, PRIMARY KEY(rec_id)) sqlite> select sql from sqlite_master where name='index-1- 9204882299253173129'; CREATE TABLE "index-1-9204882299253173129"(key BLOB PRIMARY KEY, value BLOB) sqlite> select * from `collection-0-9204882299253173129`; rec_id data ---------- ---------- 1 2
  • 14.
  • 15.
    Stitch Mobile Sync ExampleSetup Steps for Sync 1. Define Sync + Conflict Handlers on a collection 2. Specify Documents to be synced 3. Application manages local documents 4. Stitch then syncs state with the backend automatically • Bi-directional synchronization // Initialize your application, then configure Synced collections Stitch.initializeDefaultAppClient('<your-app-id>').then(() => { tripsColl.configureSync(trip_conflict, trip_change, trip_error); ... }); // Find all trips that should be synced and ensure they’re synced tripsColl.find({user: stitch.}).toArray().then(trips =>{ tripsColl.syncMany(trips) }); ... tripsColl.sync().update({trip_id:currTripId},{meal_choice: selectedMeal}); ... Coming Soon!
  • 16.
    Stitch Mobile Sync ExampleUsage Stitch syncs data when online on a per operation basis Uses 3 client-side event responders • ChangeListener • ConflictHandler • ErrorListener Defined Handlers receive all local/remote changes // On changes to the remote document the trip_change handler is called function trip_change(changeEvent){ ... if(updatedFields.keys().includes(“Gate”)){ setStatusBarUpdate(“Gate Changed”, tripID, gate); } ... } // On a conflict, the trip_conflict handler is called function trip_conflict(localDoc, remoteDoc){ newStatus = remoteDoc; for(key in remoteDoc.keys()){ if(localDoc[key] != remoteDoc[key] && isLocalPreferred(key)){ newStatus[key] = localDoc[key] } } // Returning a document from the handler will attempt to write it return newStatus; }; Coming Soon!
  • 17.
  • 18.
  • 19.
    Into the Future… Source: StarWars Tales: Into the Great Unknown (2004) (Dark Horse Comics)
  • 20.