MongoDB Stitch Functions – The AWS re:Invent Stitch Rover Demo
Please note: This article discusses MongoDB Mobile and Sync. Those products are currently being deprecated as we work towards a public beta of MongoDB Realm. To learn more about this, see the MongoDB Realm site.
This is the fourth in a series of blog posts examining how the MongoDB Mobile/Stitch-controlled rover was put together for our re:Invent demo. This post focuses on how a Stitch Function is used to provide aggregated sensor data such as the average temperature for the last 5 minutes.
A common question we were asked at re:Invent is how Stitch's serverless Functions compare with AWS Lambda functions. Stitch functions are designed to be very light-weight (run as Goroutines and deliver low latency – ideal, for example, when working with a database (especially as your function has a persistent MongoDB connection). In contrast, Lambda functions are more heavy-weight (Lambda spins up containers to run your functions in) – better suited to compute-heavy operations.
You write your functions in JavaScript (ES6) through the Stitch UI or the command line. We created this function (getReadings
) to fetch a rover's sensor data for the specified interval and then return the computed average, minimum, and maximum values:
exports = function(roverId, start, end){
 const mdb = context.services.get('mongodb-atlas');
 const sensors = mdb.db("Rovers").collection("Sensors");
 
 return sensors.find({"id": roverId, "time":{"$gt":start,"$lt":end}})
 .toArray()
 .then(readings => {
 let data = objArray.map(readings => readings.reading);
 return {"Average": data.reduce((a,b) => a + b, 0) / data.length,
 "Min": Math.min(...readings),
 "Max": Math.max(...readings)};
 });
};

This function can then be called from your app frontend code:
The frontend code to run this function is as simple as this:
context.functions.execute("getReadings", myId, samplePeriod.start, 
 samplePeriod.end);

There's a lot more that you can do in functions, such as sending data to another cloud service. You'll see an example of this in the next post which shows how a Stitch Trigger calls a Stitch function to send MongoDB Atlas data to AWS Kinesis.
If you can't wait then you can find all of the code in the Stitch Rover GitHub repo.
In summary, this is what we cover in the five posts:
- MongoDB Stitch/Mobile Mars Rover Lands at AWS re:Invent describes how MongoDB Stitch, MongoDB Mobile, Atlas, Android Things, a Raspberry Pi, and Amazon Kinesis are used to reliably control our Mars rover.
- MongoDB Stitch QueryAnywhere focuses on how the Mission Control app records the user commands in MongoDB Atlas by calling the Stitch SDK directly from the frontend code.
- MongoDB Stitch Mobile Sync shows how Stitch Mobile Sync synchronizes the user commands written to MongoDB Atlas by the Mission Control app with the MongoDB Mobile database embedded in the rover (and how it syncs the data back to Atlas when it's updated in MongoDB Mobile).
- MongoDB Stitch Functions focuses on how a Stitch Function is used to provide aggregated sensor data such as the average temperature for the last 5 minutes.
- MongoDB Stitch Triggers & Amazon Kinesis shows how we use MongoDB Stitch Triggers and the Stitch AWS service to push MongoDB database changes to Amazon Kinesis.