Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Tutorial: Use MongoDB with Azure Functions

In this tutorial, you create an HTTP-triggered Azure Function that queries data from MongoDB Atlas by using the MongoDB Node.js driver. You also learn how to manage database connections in a serverless context and deploy your function to the Azure cloud.

Before you begin, complete the following steps:

  • Deploy a MongoDB Atlas cluster, configure network access and database users, and load the sample datasets. To learn how, see the MongoDB Get Started guide.

  • Install and configure the Azure CLI.

  • Install and configure Azure Functions Core Tools.

  • Install Node.js version 18 or later.

This tutorial guides you through the following steps:

  • Create Azure cloud resources.

  • Initialize the local project.

  • Install the MongoDB Node.js driver.

  • Configure the database connection to the sample_mflix database.

  • Write a function to query the sample_mflix.movies collection and retrieve documents representing movies.

  • Test the function locally.

  • Deploy to Azure.

1

Run the following command to create a resource group, replacing <GROUP_NAME> with a name for your group and <AZURE_REGION> with a supported Azure region:

az group create \
--name <GROUP_NAME> \
--location <AZURE_REGION>

Optionally, if you are using Azure for the first time, you may need to run the following commands to register the Functions resource provider:

az provider register --namespace Microsoft.Storage
az provider register --namespace Microsoft.Web

Then, run the following command to create a storage account. Use the same region and group name from the preceding code and provide a unique name for the storage account, replacing the <STORAGE_NAME> placeholder with this unique name:

az storage account create \
--name <STORAGE_NAME> \
--location <AZURE_REGION> \
--resource-group <GROUP_NAME> \
--sku Standard_LRS

Finally, run the following command to create the Function app:

az functionapp create \
--resource-group <GROUP_NAME> \
--consumption-plan-location <AZURE_REGION> \
--runtime node \
--functions-version 4 \
--name <APP_NAME> \
--storage-account <STORAGE_NAME>
2

Run the following command to initialize a local Function project:

func init MongoExample

When prompted, select node as the worker runtime and javascript as the language.

Run the following commands to navigate into the project directory and create a new HTTP-triggered function:

cd MongoExample
func new --name GetMovies --template "HTTP trigger"

The command creates the src/functions/GetMovies.js file, which you edit in later steps.

To link your local project to the Azure Function app, run the following command from the project directory:

func azure functionapp fetch-app-settings <APP_NAME>

This command downloads all application settings from Azure, including the storage account configuration, and populates your project's local.settings.json file.

3

From the root of your project, run the following command to install the MongoDB Node.js driver:

npm install mongodb

This command adds the driver to your project and records it in package.json so that the driver is available when you deploy.

4

Open src/functions/GetMovies.js and replace its contents with the following code:

GetMovies.js
const { app } = require("@azure/functions");
const { MongoClient } = require("mongodb");
const mongoClient = new MongoClient(
process.env.MONGODB_ATLAS_URI
);
app.http("GetMovies", {
methods: ["GET"],
authLevel: "anonymous",
handler: async (request, context) => {
// Query logic added in the next step
}
});

Tip

Define mongoClient outside the handler function to reuse existing connections across invocations. If you create a new connection inside the handler, each invocation opens a new connection and risks exhausting the maximum number of concurrent connections your database supports. Defining the client at the module level keeps connection counts proportional to traffic.

Depending on your version of Node.js, you may encounter an error related to DNS resolution when you attempt to connect to MongoDB. If this occurs, add the following code to your src/functions/GetMovies.js file before creating the MongoClient instance:

GetMovies.js
const { app } = require("@azure/functions");
const { MongoClient } = require("mongodb");
// Forces DNS servers explicitly before connecting to MongoDB
require("node:dns/promises").setServers(["1.1.1.1", "8.8.8.8"]);
const mongoClient = new MongoClient(
process.env.MONGODB_ATLAS_URI
);
app.http("GetMovies", {
methods: ["GET"],
authLevel: "anonymous",
handler: async (request, context) => {
// Query logic added in the next step
}
});

Open local.settings.json and add the following fields to the Values object, replacing each placeholder with your actual values:

{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<storage-connection-string>",
"FUNCTIONS_WORKER_RUNTIME": "node",
"MONGODB_ATLAS_URI": "<atlas-connection-string>",
"MONGODB_ATLAS_DATABASE": "sample_mflix",
"MONGODB_ATLAS_COLLECTION": "movies"
},
"ConnectionStrings": {}
}

To retrieve your MongoDB Atlas connection string, navigate to the Atlas dashboard, select your cluster, and click Connect. To learn how to retrieve your Azure storage connection string, see Configure a connection string in the Azure documentation.

5

In src/functions/GetMovies.js, replace the // Query logic added in the next step comment inside the handler with the following code:

try {
const database = mongoClient.db(
process.env.MONGODB_ATLAS_DATABASE
);
const collection = database.collection(
process.env.MONGODB_ATLAS_COLLECTION
);
const results = await collection
.find({})
.limit(10)
.toArray();
return { jsonBody: results };
} catch (error) {
return {
status: 500,
jsonBody: { message: "Internal server error." }
};
}

When the function receives a request, it connects to the database and collection specified by your environment variables and returns up to 10 documents. If an error occurs, the function returns a 500 response that contains the error message.

6

From the root of your project, run the following command to start your function:

func start

When the server starts, the CLI displays the local URL for your function. Navigate to http://localhost:7071/api/GetMovies in your browser or send a request by using a tool such as cURL or Postman.

Note

If the server starts but you cannot retrieve data, verify that your local IP address is included in the Atlas network access list. The Azure data center IP rules you configured for production do not apply when testing locally. For more information, see Configure IP Access List Entries.

7

Set your environment variables in Azure by running the following commands, replacing each placeholder with your actual values:

az functionapp config appsettings set \
--name <APP_NAME> \
--resource-group <GROUP_NAME> \
--settings MONGODB_ATLAS_URI=<atlas-connection-string>
az functionapp config appsettings set \
--name <APP_NAME> \
--resource-group <GROUP_NAME> \
--settings MONGODB_ATLAS_DATABASE=sample_mflix
az functionapp config appsettings set \
--name <APP_NAME> \
--resource-group <GROUP_NAME> \
--settings MONGODB_ATLAS_COLLECTION=movies

Deploy your function by running the following command:

func azure functionapp publish <APP_NAME>
Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in <APP_NAME>:
GetMovies - [httpTrigger]
Invoke url: https://<APP_NAME>.azurewebsites.net/api/getmovies

When the deployment completes, the CLI displays a public URL for your function. Because the function uses authLevel: "anonymous", it is accessible without a key.

Note

For production deployments, consider changing authLevel to "function" or "admin" and distributing the appropriate key to authorized clients. To learn more, see the Work with access keys in Azure Functions documentation.

To learn more about the concepts covered in this tutorial, see the following resources:

Back

Deploy an Application on Vercel

On this page