Skip to content

Instantly share code, notes, and snippets.

@justinledwards
Created April 26, 2023 20:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save justinledwards/2d9d36d1c3dfdc314653eec71d62a74f to your computer and use it in GitHub Desktop.
Save justinledwards/2d9d36d1c3dfdc314653eec71d62a74f to your computer and use it in GitHub Desktop.
Mongo vs Sql code styles

Node.js Data Joins

You:

Can you write some example code for nodejs for fairly normal data joins from mysql using a common library vs mongodb as just a single document to make the same objects on both?

ChatGPT:

Sure, I can provide you with example code for both MySQL and MongoDB using Node.js. We'll use mysql2 library for MySQL and mongodb library for MongoDB. I'll assume you have both databases set up, and we'll retrieve data from two tables/collections, users and orders, and join them on the user_id field.

First, let's install the necessary libraries:

npm install mysql2
npm install mongodb

MySQL Example

const mysql = require('mysql2/promise');

const main = async () => {
  const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'your_user',
    password: 'your_password',
    database: 'your_database',
  });

  const [rows] = await connection.execute(`
    SELECT users.*, orders.*
    FROM users
    JOIN orders ON users.id = orders.user_id
  `);

  console.log(rows);
};

main().catch(console.error);

MongoDB Example

const { MongoClient } = require('mongodb');

const main = async () => {
  const client = new MongoClient('mongodb://your_user:your_password@localhost:27017/your_database');
  await client.connect();

  const db = client.db('your_database');
  const usersCollection = db.collection('users');
  const ordersCollection = db.collection('orders');

  const users = await usersCollection.find().toArray();
  const orders = await ordersCollection.find().toArray();

  const joinedData = users.map(user => {
    const userOrders = orders.filter(order => order.user_id.equals(user._id));
    return { ...user, orders: userOrders };
  });

  console.log(joinedData);
};

main().catch(console.error);

These examples show how to join data from users and orders tables/collections in MySQL and MongoDB. Note that in MongoDB, you need to join the data manually in the application code, while in MySQL, you can use the JOIN keyword to achieve the same result.

You:

what would rows look like from the mysql example vs joinedData from the second?

ChatGPT:

In the MySQL example, the rows variable will be an array of objects, with each object containing all the properties (columns) from both users and orders tables. For instance, if you have the following data in your MySQL database:

users table:

| id | name  |
|----|-------|
| 1  | Alice |
| 2  | Bob   |

orders table:

| id | user_id | item  | price |
|----|---------|-------|-------|
| 1  | 1       | Book  | 10    |
| 2  | 1       | Pen   | 2     |
| 3  | 2       | Pencil| 1     |

The rows variable will look like:

[
  { id: 1, name: 'Alice', id_1: 1, user_id: 1, item: 'Book', price: 10 },
  { id: 1, name: 'Alice', id_1: 2, user_id: 1, item: 'Pen', price: 2 },
  { id: 2, name: 'Bob', id_1: 3, user_id: 2, item: 'Pencil', price: 1 },
]

In the MongoDB example, the joinedData variable will be an array of objects, where each object represents a user document along with a nested orders property containing an array of the user's orders. For example, if you have the following data in your MongoDB database:

users collection:

[
  { _id: ObjectId("..."), name: "Alice" },
  { _id: ObjectId("..."), name: "Bob" }
]

orders collection:

[
  { _id: ObjectId("..."), user_id: ObjectId("..."), item: "Book", price: 10 },
  { _id: ObjectId("..."), user_id: ObjectId("..."), item: "Pen", price: 2 },
  { _id: ObjectId("..."), user_id: ObjectId("..."), item: "Pencil", price: 1 },
]

The joinedData variable will look like:

[
  {
    _id: ObjectId("..."),
    name: 'Alice',
    orders: [
      { _id: ObjectId("..."), user_id: ObjectId("..."), item: 'Book', price: 10 },
      { _id: ObjectId("..."), user_id: ObjectId("..."), item: 'Pen', price: 2 },
    ],
  },
  {
    _id: ObjectId("..."),
    name: 'Bob',
    orders: [
      { _id: ObjectId("..."), user_id: ObjectId("..."), item: 'Pencil', price: 1 },
    ],
  },
]

In the MySQL result, each row contains data from both users and orders tables, while in the MongoDB result, each object represents a user with a nested array of their orders. The structure of the MongoDB result is more hierarchical and easier to work with programmatically.

You:

show what the full code required on each approach would look like if you wanted to just have an array of objects like orders = [{ user: 'Alice', items ['Book', 'Pen']}] at the end

ChatGPT:

Here's the modified code for both MySQL and MongoDB to achieve the desired output.

MySQL Example

const mysql = require('mysql2/promise');

const main = async () => {
  const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'your_user',
    password: 'your_password',
    database: 'your_database',
  });

  const [rows] = await connection.execute(`
    SELECT users.name, orders.item
    FROM users
    JOIN orders ON users.id = orders.user_id
  `);

  const orders = rows.reduce((acc, row) => {
    const user = acc.find(user => user.user === row.name);
    if (user) {
      user.items.push(row.item);
    } else {
      acc.push({ user: row.name, items: [row.item] });
    }
    return acc;
  }, []);

  console.log(orders);
};

main().catch(console.error);

MongoDB Example

const { MongoClient } = require('mongodb');

const main = async () => {
  const client = new MongoClient('mongodb://your_user:your_password@localhost:27017/your_database');
  await client.connect();

  const db = client.db('your_database');
  const usersCollection = db.collection('users');
  const ordersCollection = db.collection('orders');

  const users = await usersCollection.find().toArray();
  const orders = await ordersCollection.find().toArray();

  const joinedData = users.map(user => {
    const userOrders = orders.filter(order => order.user_id.equals(user._id));
    const items = userOrders.map(order => order.item);
    return { user: user.name, items };
  });

  console.log(joinedData);
};

main().catch(console.error);

In both examples, the final output will be:

[
  { user: 'Alice', items: ['Book', 'Pen'] },
  { user: 'Bob', items: ['Pencil'] },
]

The main difference between the two examples is how the data is aggregated. In the MySQL example, we use reduce to group the results by the user's name and create an array of items. In the MongoDB

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment