@cutau/mongodb
v1.0.28
Published
Utilities for interacting with MongoDB.
Readme
@cutau/mongodb
Utilities for interacting with MongoDB.
Installation
bun add @cutau/mongodbUsage
Create a file <database>.mongo.ts to define the MongoDB connection and collections:
// <database>.mongo.ts
import { iLog, secretizeUri } from '@cutau/common/log.utils';
import type { MongoApplicationsConfig, MongoCollections, MongoContextOptions } from '@cutau/mongodb';
import { buildMongoContext, connectToMongo } from '@cutau/mongodb';
import type { Collection1Type, Collection2Type } from './<database>.models.js';
import type * as mongoDB from 'mongodb';
const MONGO_APPS_CONFIG: MongoApplicationsConfig = {
app1: {
local: {
host: 'localhost:27017',
db: 'app1-db',
},
dev: {
host: 'dev-mongo:27017',
db: 'app1-db',
},
stage: {
host: 'stage-mongo:27017',
db: 'app1-db',
},
prod: {
host: 'prod-mongo:27017',
db: 'app1-db',
},
},
app2: {
local: {
host: 'localhost:27017',
db: 'app2-db',
},
dev: {
host: 'atlas:27017',
db: 'app2-db-dev',
},
stage: {
host: 'atlas:27017',
db: 'app2-db-stage',
},
prod: {
host: 'atlas:27017',
db: 'app2-db-prod',
},
},
};
/**
* Extend MongoCollections to add your application-specific collections.
*/
export interface AppCollections extends MongoCollections {
collection1: mongoDB.Collection<Collection1Type>;
collection2: mongoDB.Collection<Collection2Type>;
}
export let collections: AppCollections;
export async function connectAndInitializeMongoCollections(options: MongoContextOptions, logContext: boolean = false): Promise<void> {
const mongoContext = buildMongoContext(MONGO_APPS_CONFIG, options);
if (logContext) {
iLog('mongo.context', mongoContext);
}
const client = await connectToMongo(mongoContext);
const db = client.db();
collections = {
client,
db,
collection1: db.collection('collection1'),
collection2: db.collection('collection2'),
};
const numCollections = Object.keys(collections).length - 2; // subtract client and db
iLog('mongo.connected', {
uri: secretizeUri(mongoContext.mongoUri),
database: db.databaseName,
collections: numCollections,
});
}Then within a script, get the MongoDB connection options and connect to the database:
// my-script.main.ts
import { addLoggingYargs, buildYargs, setLogLevelFromYargs } from '@cutau/common-node/yarg.utils';
import { LOG, LogLevel } from '@cutau/common/log.utils';
import { addMongoYargs, assertMongoYargsOptions, yargsToMongoContextOptions } from '@cutau/mongodb/mongo-yargs.utils';
import { collections, connectAndInitializeMongoCollections } from './<database>.mongo.js';
let yargv = buildYargs();
yargv = addLoggingYargs(yargv);
yargv = addMongoYargs(yargv);
const argv = yargv.argv;
setLogLevelFromYargs(argv as { loglevel: LogLevel });
LOG.debug('argv', argv);
assertMongoYargsOptions(argv);
await connectAndInitializeMongoCollections(yargsToMongoContextOptions(argv), true);
// ... now do your thing, for example ...
const collection1Items = await collections.collection1.find({}).toArray();