This technical tutorial will guide you through creating a Local LLM API with a Node.js backend that connects to a MongoDB database (including combining dependent collections), exposes a REST API for real-time inference, and uses the open-source Ollama platform to run the deepseek-r1 LLM. This approach helps you build AI API locally with proper database and model integration.
Overview
- LLM Integration: Run and query the DeepSeek-R1 model locally with Ollama.This forms the base of a self-hosted LLM API.
- Database: Connect your server to MongoDB, including advanced queries using joins across collections with $lookup to achieve seamless MongoDB LLM integration.
- Tech Stack: Node.js (Express), Ollama (with ollama NPM package), MongoDB (with mongodb or mongoose package). This setup enables robust Node.js LLM API development.
Ollama deepseek-r1 Setup Guide: Prerequisites
-
- Install Node.js and npm
- On Ubuntu/debian:
- Install Node.js and npm
sudo apt update sudo apt install nodejs npm -y node -v npm -v
- For Windows or Mac, download installers from the official Node.js site.
- MongoDB running (local or Atlas)
- Install Ollama
- Download and install from the Ollama website.
- Or via terminal (for Ubuntu):
curl -fsSL https://ollama.com/install.sh | sh
- Verify Installation
ollama --version
Download the DeepSeek-R1 Model
ollama --version
With this command, the model is downloaded to your local computer from Ollama’s model collection.
- Start the Ollama Server with deepseek-r1 model:
ollama pull deepseek-r1
With this command, the model is downloaded to your local computer from Ollama’s model collection.
- Start the Ollama Server with deepseek-r1 model:
ollama run deepseek-r1
This launches the Ollama deepseek-r1 API service locally, ready to accept API calls.
Project Boilerplate
mkdir deepseek-node-llm cd deepseek-node-llm npm init -y npm install express ollama mongodb
File Structure and Code by File
Your working directory should look like:
deepseek-node-llm/ │ ├── db.js ├── joinCollections.js ├── ollamaClient.js ├── index.js ├── package.json
db.js — MongoDB Connection
const { MongoClient } = require('mongodb'); const uri = "mongodb://localhost:27017"; const dbName = "mydatabase"; async function getDb() { const client = new MongoClient(uri, {useUnifiedTopology: true}); await client.connect(); return client.db(dbName); } module.exports = getDb;
joinCollections.js — Join Collections by Dependency
const getDb = require('./db'); // Example joins orders with products and then with suppliers. async function joinOrdersWithProductsSuppliers() { const db = await getDb(); const results = await db.collection('orders').aggregate([ { $lookup: { from: 'products', localField: 'product_id', foreignField: '_id', as: 'product_details' } }, { $unwind: '$product_details' }, { $lookup: { from: 'suppliers', localField: 'product_details.supplier_id', foreignField: '_id', as: 'supplier_details' } } ]).toArray(); return results; } module.exports = { joinOrdersWithProductsSuppliers };
ollamaClient.js — Query DeepSeek-R1 via Ollama
const getDb = require('./db'); // Example joins orders with products and then with suppliers. async function joinOrdersWithProductsSuppliers() { const db = await getDb(); const results = await db.collection('orders').aggregate([ { $lookup: { from: 'products', localField: 'product_id', foreignField: '_id', as: 'product_details' } }, { $unwind: '$product_details' }, { $lookup: { from: 'suppliers', localField: 'product_details.supplier_id', foreignField: '_id', as: 'supplier_details' } } ]).toArray(); return results; } module.exports = { joinOrdersWithProductsSuppliers };
index.js — Main Express API Server
const express = require('express'); const bodyParser = require('body-parser'); const { joinOrdersWithProductsSuppliers } = require('./joinCollections'); const { queryDeepSeek } = require('./ollamaClient'); const app = express(); app.use(bodyParser.json()); app.get('/api/joined-orders', async (req, res) => { try { const data = await joinOrdersWithProductsSuppliers(); res.json(data); } catch (err) { res.status(500).json({ error: "DB error" }); } }); app.post('/api/llm', async (req, res) => { const prompt = req.body.prompt; try { const answer = await queryDeepSeek(prompt); res.json({ answer }); } catch (err) { res.status(500).json({ error: "LLM error" }); } }); app.listen(3000, () => console.log("API running on http://localhost:3000"));
This completes the Node.js AI API development for your local LLM setup.
Run the Full Stack
Start MongoDB
(ensure your instance is running).
Start Ollama Server and DeepSeek-R1:
ollama run deepseek-r1
Start Node.js API:
node index.js
API Examples
- Join Orders, Products, Suppliers:
GET http://localhost:3000/api/joined-orders
- Get LLM Response:
POST http://localhost:3000/api/llm Content-Type: application/json { "prompt": "Explain what is MongoDB aggregation?" }
Summary Table — Files and Purposes
File | Purpose |
db.js | Enables you to reuse the MongoDB connection across all of your files without having to duplicate setup code by setting it up and exporting it. |
joinCollections.js | Shows how to multiple MongoDB LLM integration (e.g., orders, products, suppliers) using MongoDB’s $lookup aggregation, letting you fetch related data as a single combined result. |
ollamaClient.js | Lets you connect and send prompts to the locally running Ollama deepseek-r1 API on Ollama, and get back language model responses for your queries. |
index.js |
The Express.js server that exposes two routes:
|
package.json | Project metadata, dependencies |
Summary:
This setup allows you to build AI API locally that serves AI answers and combines them with relational (joined) data from MongoDB—all through a simple RESTful API using easy-to-read code and modular files.
Whether you are working with a Local AI model API or scaling towards a self-hosted LLM API, this stack makes it easy and efficient. For tailored solutions, reach out us for Custom AI Support.
Practical tip:
Before interacting with the API (from Node.js), just open a terminal and start Ollama:
ollama serve
or ensure it’s launched via the Desktop app or as a background service.
About Author
Tarun Bansal - Technical Head
Tarun is a technology enthusiast with a flair for solving complex challenges. His technical expertise and deep knowledge of emerging trends have made him a go-to person for strategic tech initiatives. Passionate about innovation, Tarun continuously explores new ways to drive efficiency and performance in every project he undertakes.