[MongoDB] ๋งต๋ฆฌ๋“€์Šค(map reduce)

๋งต๋ฆฌ๋“€์Šค๋Š” ์ดˆ๋Œ€ํ˜•๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๋งต๋ฆฌ๋“€์Šค ์ „์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์œผ๋กœ๋Š” Hadoop์ด ์žˆ๋Š”๋ฐ, ๋ชฝ๊ณ DB๋„ ์ œํ•œ์ ์ด์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
ํ•˜๋‘ก์ฒ˜๋Ÿผ ๋””์Šคํฌ์— ์ž˜ ์˜ฌ๋ผ๊ฐ€์ง€๋„ ์•Š๋Š” ์ดˆ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์ง€๋งŒ, ๋ญ”๊ฐ€ ๊ทธ ์•„๋ž˜์˜ ์• ๋งคํ•œ ์ง€์ ์—์„œ๋Š” ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ• ๋งŒํ•˜๋‹ค.

mongodb 5.0๋ถ€ํ„ฐ๋Š” ์ด๊ฒƒ ๋Œ€์‹  aggregation-pipeline์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ๊ทธ์ชฝ์ด ๋” ๋น ๋ฅด๊ณ  ์ตœ์ ํ™”๋„ ์ž˜ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.




๊ตฌ์กฐ

map reduce๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์กฐ๊ฑด์ธ query, ์ตœ์ดˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” map, ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃจํ•‘ํ•ด์„œ ์ถ•์†Œํ•˜๋Š” reduce๋‹ค.
์•„๋ž˜๋Š” ๊ทธ ์˜ˆ์‹œ๋‹ค.

์ง์ ‘ ํ•œ๋ฒˆ ํ•ด๋ณด์ž.
์šฐ์„  ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์„ธํŒ…์„ ํ•œ๋‹ค.

db.orders

// random datas
// random datas
db.orders.insertMany([
  {
    buyer_id: 1,
    product_id: 154,
    price: 200,
    quantity: 5,
    date: new Date("2014-03-01T08:00:00Z"),
  },
  {
    buyer_id: 2,
    product_id: 155,
    price: 150,
    quantity: 2,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 3,
    product_id: 156,
    price: 5500,
    quantity: 1,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 4,
    product_id: 157,
    price: 440,
    quantity: 1,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 5,
    product_id: 158,
    price: 510,
    quantity: 1,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 1,
    product_id: 159,
    price: 520,
    quantity: 1,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 3,
    product_id: 1999,
    price: 100,
    quantity: 1,
    date: new Date("2014-03-01T08:00:00Z"),
  },
  {
    buyer_id: 3,
    product_id: 155,
    price: 150,
    quantity: 2,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 3,
    product_id: 44,
    price: 50,
    quantity: 14,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 4,
    product_id: 12,
    price: 330,
    quantity: 1,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 5,
    product_id: 14,
    price: 140,
    quantity: 3,
    date: new Date("2014-03-01T09:00:00Z"),
  },
  {
    buyer_id: 1,
    product_id: 1500,
    price: 52,
    quantity: 4,
    date: new Date("2014-03-01T09:00:00Z"),
  },
]);

๊ทธ๋ฆฌ๊ณ  ๊ตฌ๋งค์ž(buyer_id)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ ์ด ์–ผ๋งˆ๋‚˜ ๋ˆ์„ ์ผ๋Š”์ง€ ๊ตฌํ•˜๋Š” ๋งต๋ฆฌ๋“€์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋ดค๋‹ค.

db.orders.mapReduce(
  function () {
    emit(this.buyer_id, { price: this.price, quantity: this.quantity });
  },
  function (key, values) {
    return values.reduce((acc, curr) => acc + curr.price * curr.quantity, 0);
  },
  { out: "temp" }
);

์ฒซ๋ฒˆ์งธ ์ธ์ž์ธ map์—์„œ๋Š”, emit์œผ๋กœ reduce์— ๋ณด๋‚ผ key-value ์Œ์„ ๋ณด๋‚ธ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” reduce์—์„œ๋Š” ๊ฐ ํ‚ค๋ณ„๋กœ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ aggregateํ• ์ง€๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ ๊ตฌ๋งค ๊ธˆ์•ก์„ ๋‹จ๊ฐ€*๊ฐœ์ˆ˜๋กœ ๊ณฑํ•ด์„œ ์ „๋ถ€ ๋”ํ•˜๋„๋ก ํ–ˆ๋‹ค.
์„ธ๋ฒˆ์งธ ์ธ์ž์—์„œ out์€ ๊ฒฐ๊ณผ๋ฌผ์„ ์ €์žฅํ•  collection๋ช…์„ ์ง€์ •ํ•œ๋‹ค.

์ €๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด


์ด๋ ‡๊ฒŒ ์ € ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ด์งˆ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์“ฐ๋ฉด ๋œ๋‹ค.


์ฐธ์กฐ
https://www.mongodb.com/docs/manual/core/map-reduce/