It's been super easy integrating node with mongodb to create a PLOSDB server. Since all of the assets are static with PLOSDB, a document store made sense. Instead of going a normal CRUD route, I've instead opted to make the entire database dynamic and easily configured. as below.

import {users} from './users/';
import {generate} from './generate/';
import {isAuthenticated} from '../authentication/';
import {
  express,searchConfigure,getAllConfigure,
  getIDConfigure,putIDConfigure,postConfigure,
  deleteIDConfigure
} from '../config';

const router = express.Router({mergeParams: true});

const routes = [
  {uri: '/emotes', collections: ['']},
  {uri: '/abilities', collections: ['']},
  {uri: '/classes', collections: ['']},
  {uri: '/items', collections: ['']},
  {uri: '/help', collections: ['']},
  {uri: '/races', collections: ['']},
  {uri: '/personas', collections: ['']},
  {
    uri: '/worlds',
    collections: [
      '.continents',
      '.provinces',
      '.areas',
      '.maps',
      ''
    ]
  },
  {
    uri: '/configurations',
    collections: [
      '.creatureSizes',
      '.merchants',
      '.months',
      '.time',
      '.temperature',
      '.rodes',
      '.weather',
      '.walls',
      '.floors',
      '.water',
      '.environments',
      '.environmentAdjectives',
      '.environmentEvents',
      '.generationCraftsmanship',
      '.generationFoodItems',
      '.generationMiscItems',
      '.generationMoney',
      '.generationTypes',
      '.generationTypePrefixes',
      '.generationTypeSuffixes',
      '.roomTypes',
      '.habitats',
      '.softTransforms',
      '.hardTransforms',
      '.houseTypes',
      '.landformDistinctions',
      '.landformTransforms',
      '.magicalPrefixes',
      '.magicalSuffixes',
      '.mobileClasses',
      '.mobileExistence',
      '.mobileArchetypes',
      '.mobileRanks',
      '.magicalCreatures',
      '.standardCreatures',
      '.vermin',
      '.naturalDecorations'
    ]
  }
];
const routeUris = (function composeUris(){
  let uris = [];

  routes.forEach(route=>{
    route.collections.forEach(collection=>{
      uris.push({
        name: route.uri+collection.replace('.','/'),
        options: [
          '/search[GET]','/[GET]','/:id[GET]',
          '/:id[PUT]','/[POST]','/:id[DELETE]'
        ]
      });
    });
  });
  uris.push({
    name: '/users',
    options: [
      '/exists[GET]?name=$','/login[POST]{username,password}',
      '/:id[PUT]','[POST]','/:id[DELETE]',
      '/[GET]'
    ]
  });
  uris.push({
    name: '/generate',
    options: [
      '/weapon[GET]?type=$&minlevel=$&maxlevel=$&type=$&craftsmanship=$&material=$',
      '/armor[GET]?type=$&minlevel=$&maxlevel=$&type=$&craftsmanship=$&material=$',
      '/misc[GET]?type=$',
      '/food[GET]?type=$',
      '/money[GET]?type=$'
    ]
  });
  return uris;
})();

router.get('/',(req,res)=> res.json(routeUris));
router.use('/users', users);
router.use('/generate', generate);
routes.forEach(route=>{
  route.collections.forEach(collection=>{
    let subRouter = express.Router({mergeParams: true});

    // allow dynamic searching of the collection
    subRouter.get(
      `${collection.replace('.','/')}/search`,
      searchConfigure(`${route.uri.replace('/','')}${collection}`)
    );

    // Service up the root collection with all subdocuments
    subRouter.get(
      `${collection.replace('.','/')}/`,
      getAllConfigure(`${route.uri.replace('/','')}${collection}`)
    );

    // each document may be queried by id
    subRouter.get(
      `${collection.replace('.','/')}/:id`,
      getIDConfigure(`${route.uri.replace('/','')}${collection}`)
    );

    // save a specified document
    subRouter.put(
      `${collection.replace('.','/')}/:id`,
      isAuthenticated,
      putIDConfigure(`${route.uri.replace('/','')}${collection}`)
    );

    // create a new document
    subRouter.post(
      `${collection.replace('.','/')}/`,
      isAuthenticated,
      postConfigure(`${route.uri.replace('/','')}${collection}`)
    );

    // delete a document
    subRouter.delete(
      `${collection.replace('.','/')}/:id`,
      isAuthenticated,
      deleteIDConfigure(`${route.uri.replace('/','')}${collection}`)
    );

    // attach this subroute to the main api router
    router.use(route.uri,subRouter);
  });
});

// export the extended router
export {router as api};

Where simple helper controllers such as searchConfigure represent their basic utilities across all routes as such:

// Export all of the instances each routing module will
// need to use to build routes simply
export function searchConfigure(cName){
  return async (req,res)=>{
    const inputQuery = req.query,
          outputQuery = {},
          keys = Object.keys(inputQuery);

    try{
      if(!keys.length){
        res.status(400).json({error: 'Search keys are missing.'});
      }else{
        keys.forEach(key=>{
          outputQuery[key] = {$regex: inputQuery[key], $options: 'i'};
        });
        res.status(200).json(
          await db.collection(cName).find(outputQuery).toArray()
        );
      };
    }catch(err){
      console.log(err);
      res.status(500).json({error: 'problem processing request'});
    }
  };
} //end searchConfigure()