When selecting, both tables and columns can be mapped to alternate property names in the resulting normalized document. DataContext#from, FromAdapter#select, and From#join can be given TableMetaList~TableMeta objects to describe how columns and tables should be mapped. Building on the previous examples, the bike_shops table and columns can be aliased as follows:
'use strict'; const MySQLDriver = require('node-data-mapper-mysql').MySQLDriver; const driver = new MySQLDriver(require('../bikeShopConOpts.json')); driver .initialize() .then(runQuery) .then(printResult) .catch(console.error) .finally(() => driver.end()); function runQuery(dataContext) { const query = dataContext // Map the "bike_shops" table to a property named "shops." .from({table: 'bike_shops', as: 'bs', mapTo: 'shops'}) // "bikeShopID" will map to a property named "id," and "name" will map to // "shopName." .select( {column: 'bs.bikeShopID', mapTo: 'id'}, {column: 'bs.name', mapTo: 'shopName'} ); // This is the query that will be executed. console.log('Query:'); console.log(query.toString(), '\n'); // Executing a query returns a promise. return query .execute(); } function printResult(result) { console.log('Result:'); console.log(result); }
And here's the result ($ node example/retrieve/adHocMapping.js):
Query: SELECT `bs`.`bikeShopID` AS `bs.bikeShopID`, `bs`.`name` AS `bs.name` FROM `bike_shops` AS `bs` Result: { shops: [ { id: 1, shopName: 'Bob\'s Bikes' }, { id: 2, shopName: 'Zephyr Cove Cruisers' }, { id: 3, shopName: 'Cycle Works' } ] }
Note that it's also possible to define custom mappings at initialization time. Take a look at the tutorials in the Schema section for an example of how this can be done.