๋ฌธ์„œ ๋ฉ”๋‰ด
๋ฌธ์„œ ํ™ˆ
/
MongoDB ์•„ํ‹€๋ผ์Šค
/ / /

$merge

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ํ•„์š”ํ•œ ๊ถŒํ•œ
  • ๊ณ ๋ ค ์‚ฌํ•ญ
  • ๊ตฌ๋ฌธ
  • ํ•„๋“œ
  • ์˜ต์…˜
  • ์ค‘๋ณต ๋ฌธ์„œ ID ํ•ด๊ฒฐ
  • Atlas Data Federation์—์„œ ์ค‘๋ณต ID ํ™•์ธ
  • ์ค‘๋ณต ID ์ˆ˜์ •ํ•˜๊ธฐ
  • ์˜ˆ์ œ
  • (์œผ)๋กœ ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ $merge
  • ๋ฐฐ๊ฒฝ์—์„œ $merge ์‹คํ–‰

$merge ์ง‘๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ ์˜ ๊ฒฐ๊ณผ๋ฅผ Atlas cluster์˜ ์ž„์‹œ ์ปฌ๋ ‰์…˜์— ์”๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Atlas Data Federation์€ Atlas cluster์—์„œ ๋กœ์ปฌ๋กœ $merge ๋ฅผ ์‹คํ–‰ ํ•˜์—ฌ ์ฒญํฌ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ ์ปฌ๋ ‰์…˜์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค . $merge ์ž‘์—… ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ตœ์†Œํ•œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋Œ€์ƒ ์ปฌ๋ ‰์…˜์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

Atlas Data Federation์—์„œ $merge๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ง€์›๋˜๋Š” ์—ฐํ•ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค ์ €์žฅ์†Œ ์ค‘ ํ•˜๋‚˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค.

  • ๋™์ผํ•œ Atlas ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ Atlas cluster, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ์ปฌ๋ ‰์…˜์— ์”๋‹ˆ๋‹ค.

Atlas Data Federation์€ Atlas cluster์— ์“ฐ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜ into ํ•„๋“œ์— ๋Œ€์ฒด ๊ตฌ๋ฌธ ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. Atlas Data Federation์€ $merge ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ $merge ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

$merge ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Atlas cluster์˜ ์ปฌ๋ ‰์…˜์— ์“ฐ๋ ค๋ฉด ๋‹ค์Œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์• ๊ทธ๋ฆฌ๊ฒŒ์ด์…˜์ด ์‹คํŒจํ•˜๋ฉด Atlas Data Federation์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— $merge ๊ฐ€ ์™„๋ฃŒํ•œ ์“ฐ๊ธฐ๋ฅผ ๋กค๋ฐฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

{
"$merge": {
"into": {
"atlas": {
"projectId": "<atlas-project-ID>",
"clusterName": "<atlas-cluster-name>",
"db": "<atlas-database-name>",
"coll": "<atlas-collection-name>"
}
},
"on": "<identifier field>"|[ "<identifier field1>", ...],
"let": { <variables> },
"whenMatched": "replace|keepExisting|merge|fail|pipeline",
"whenNotMatched": "insert|discard|fail"
}
}

์ด ์„น์…˜์—์„œ๋Š” Atlas Data Federation์ด into ํ•„๋“œ์— ์ œ๊ณตํ•˜๋Š” ๋Œ€์ฒด ๊ตฌ๋ฌธ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ
์œ ํ˜•
์„ค๋ช…
ํ•„์š”์„ฑ
atlas
๊ฐ์ฒด
aggregation pipeline์—์„œ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•  ์œ„์น˜์ž…๋‹ˆ๋‹ค.
ํ•„์ˆ˜ ์‚ฌํ•ญ
clusterName
๋ฌธ์ž์—ด
Atlas cluster์˜ ์ด๋ฆ„.
ํ•„์ˆ˜ ์‚ฌํ•ญ
coll
๋ฌธ์ž์—ด
Atlas cluster์— ์žˆ๋Š” ์ปฌ๋ ‰์…˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
ํ•„์ˆ˜ ์‚ฌํ•ญ
db
๋ฌธ์ž์—ด
์ปฌ๋ ‰์…˜์ด ํฌํ•จ๋œ Atlas cluster์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
ํ•„์ˆ˜ ์‚ฌํ•ญ
projectId
๋ฌธ์ž์—ด
Atlas cluster๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์—ฐํ•ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด ์—ฐํ•ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ID๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.
์˜ต์…˜

๋‹ค๋ฅธ ํ•„๋“œ on, let, whenMatched ๋ฐ whenNotMatched ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด $merge ์— ๋Œ€ํ•œ MongoDB ์„œ๋ฒ„ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฐธ๊ณ 

์—ฌ๋Ÿฌ ํ•„๋“œ์—์„œ on ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ``on`` ์‹๋ณ„์ž ํ•„๋“œ์— ๋ณตํ•ฉ ๊ณ ์œ  ์ธ๋ฑ์Šค ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜
์œ ํ˜•
์„ค๋ช…
ํ•„์š”์„ฑ
background
๋ถ€์šธ

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์• ๊ทธ๋ฆฌ๊ฒŒ์ด์…˜ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋„๋ก ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. true ๋กœ ์„ค์ •ํ•˜๋ฉด Atlas Data Federation์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

{ "background" : true }

์ฟผ๋ฆฌ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ฟผ๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ํ†ตํ•ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค ์—ฐ๊ฒฐ์ด ๋Š๊ธธ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ƒˆ ์ฟผ๋ฆฌ๋ฅผ ์ œ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์˜ต์…˜

์•„์นด์ด๋ธŒ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์—์„œ Atlas cluster๋กœ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ฌธ์„œ์— ์ค‘๋ณต๋œ _id ํ•„๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„น์…˜์—์„œ๋Š” Atlas Data Federation์ด ์ค‘๋ณต์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์• ๊ทธ๋ฆฌ๊ฒŒ์ด์…˜ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ค‘๋ณต์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Atlas Data Federation์€ ์ค‘๋ณต์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฌธ์„œ๋ฅผ ๋ฐ›๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ค‘๋ณต์ด ๋ฐœ๊ฒฌ๋  ๋•Œ๊นŒ์ง€ ๋ฌธ์„œ๋ฅผ ๋ฐ›๋Š” ์ˆœ์„œ๋Œ€๋กœ Atlas ์ปฌ๋ ‰์…˜ X์— ๋ฌธ์„œ๋ฅผ ์”๋‹ˆ๋‹ค.

  2. ์ค‘๋ณต๋œ _id ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๋ฌธ์„œ์™€ ๋ชจ๋“  ํ›„์† ๋ฌธ์„œ๋ฅผ ์ƒˆ Atlas ์ปฌ๋ ‰์…˜ Y์— ์”๋‹ˆ๋‹ค.

  3. ์ง€์ •๋œ $merge ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ปฌ๋ ‰์…˜ Y๋ฅผ ์ปฌ๋ ‰์…˜ X์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ฒฐ๊ณผ ๋ฌธ์„œ๋ฅผ ์ง€์ •๋œ Atlas cluster์˜ ๋Œ€์ƒ ์ปฌ๋ ‰์…˜์— ์”๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Atlas Data Federation์€ _id ํ•„๋“œ์—์„œ ์ค‘๋ณต๋œ ๊ฐ’๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์œ  ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ํ•„๋“œ์˜ ์ค‘๋ณต ๊ฐ’์€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ค‘๋ณต๋œ _id ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํŒŒ์ดํ”„๋ผ์ธ์— $sort ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•˜์—ฌ Atlas Data Federation์ด ๊ฒฐ๊ณผ ๋ฌธ์„œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. $merge ๋‹จ๊ณ„๋กœ ์œ ์ž…๋˜๋Š” ๋ฌธ์„œ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ $merge ๋‹จ๊ณ„์˜ whenMatched ๋ฐ whenNotMatched ์˜ต์…˜ ๊ฐ’์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ์ œ

    ๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” whenMatched ์˜ต์…˜์ด keepExisting ๋˜๋Š” replace๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ Atlas Data Federation์ด $merge ๋‹จ๊ณ„์—์„œ ์ค‘๋ณต์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    {
    "_id" : 1,
    "state" : "FL"
    },
    {
    "_id" : 1,
    "state" : "NJ"
    },
    {
    "_id" : 2,
    "state" : "TX"
    }
  3. whenNotMatched: discard ์˜ต์…˜์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    ์˜ˆ์ œ

    ์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ whenNotMatched ์˜ต์…˜์ด discard๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ Atlas Data Federation์ด ์ค‘๋ณต์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

    {
    "_id" : 1,
    "state" : "AZ"
    },
    {
    "_id" : 1,
    "state" : "CA"
    },
    {
    "_id" : 2,
    "state" : "NJ"
    },
    {
    "_id" : 3,
    "state" : "NY"
    },
    {
    "_id" : 4,
    "state" : "TX"
    }

    ์œ„์— ๋‚˜์—ด๋œ ๋ฌธ์„œ์— ๋Œ€ํ•ด ๋‹ค์Œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    db.archivecoll.aggregate([
    {
    "$sort": {
    "_id": 1,
    "state": 1,
    }
    },
    {
    "$merge": {
    "into": {
    "atlas": {
    "clusterName": "clustername",
    "db": "clusterdb",
    "coll": "clustercoll"
    }
    },
    "on": "_id",
    "whenMatched": "replace",
    "whenNotMatched": "discard"
    }
    }
    ])

    Atlas Data Federation์€ X ๋ฐ Y๋ผ๋Š” ๋‘ ์ปฌ๋ ‰์…˜์— ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค.

    Atlas Data Federation์€ Y ์ปฌ๋ ‰์…˜์˜ ๋ฌธ์„œ๋ฅผ X ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์˜ whenMatched: replace ์˜ต์…˜์˜ ๊ฒฝ์šฐ Atlas Data Federation์€ ์ปฌ๋ ‰์…˜ X์˜ _id: 1 ๋ฌธ์„œ๋ฅผ ์ปฌ๋ ‰์…˜ Y์˜ _id: 1์ด ์žˆ๋Š” ๋ฌธ์„œ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์˜ whenNotMatched: discard ์˜ต์…˜์˜ ๊ฒฝ์šฐ Atlas Data Federation์€ ์ปฌ๋ ‰์…˜ X์˜ ๋ฌธ์„œ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ปฌ๋ ‰์…˜ Y์˜ ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘๋ณต ํ•ญ๋ชฉ์ด ์žˆ๋Š” ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฐ๊ณผ์—๋Š” ๋‹ค์Œ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    {
    "_id" : 1,
    "state" : "CA"
    }

    ๊ทธ๋Ÿฐ ๋‹ค์Œ Atlas Data Federation์€ ์ด ๋ฌธ์„œ๋ฅผ ์ง€์ •๋œ Atlas cluster์˜ ๋Œ€์ƒ ์ปฌ๋ ‰์…˜์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ $merge ๊ตฌ๋ฌธ์€ ์ด๋ฆ„์ด myTestCluster ์ธ Atlas cluster์˜ sampleDB.mySampleData ์ปฌ๋ ‰์…˜์— ๊ฒฐ๊ณผ๋ฅผ ์”๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ ID๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. $merge ๋‹จ๊ณ„์—์„œ๋Š” ์—ฐํ•ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ID๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

1db.mySampleData.aggregate(
2 [
3 {
4 "$merge": {
5 "into": {
6 "atlas": {
7 "clusterName": "myTestCluster",
8 "db": "sampleDB",
9 "coll": "mySampleData"
10 }
11 },
12 ...
13 }
14 }
15 ]
16)

๋‹ค์Œ ์˜ˆ์‹œ $merge ๊ตฌ๋ฌธ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ด๋ฆ„์ด myTestCluster ์ธ Atlas cluster์˜ sampleDB.mySampleData ์ปฌ๋ ‰์…˜์— ๊ฒฐ๊ณผ๋ฅผ ์”๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ ID๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. $merge ๋‹จ๊ณ„์—์„œ๋Š” ์—ฐํ•ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ID๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

1db.mySampleData.aggregate(
2 [
3 {
4 "$merge": {
5 "into": {
6 "atlas": {
7 "clusterName": "myTestCluster",
8 "db": "sampleDB",
9 "coll": "mySampleData"
10 }
11 },
12 ...
13 }
14 }
15 ],
16 { "background" : true }
17)
โ†ย $lookup
$outย โ†’