MongoDB - CRUD, Aggregate

2026. 4. 7. 11:18ยท๐ŸŒฑ MongoDB

MongoDB

 

 

โœ… Create Document


show dbs
admin   40.00 KiB
config  72.00 KiB
local   40.00 KiB
use movies
switched to db movies
db.createCollection("movies")
{ ok: 1 }
db.movies.insertOne({})
{
  acknowledged: true,
  insertedId: ObjectId('69d466bc1fef767903389270')
}
db.movies.insertOne({
  title: "The Godfather",
  year: 1999,
  director: {
    name: "F.F.C",
    alive: true
  },
  genres: ["Crime", "Drama", "Pizza"]
})
{
  acknowledged: true,
  insertedId: ObjectId('69d4674a1fef767903389271')
}
movies

 

 

โœ… Read Document


์ „์ฒด ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

db.movies.find()

 

ํŠน์ •ํ•œ ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

db.movies.find({
  director: "Christopher Nolan"
})

๊ฐ๋… ์ด๋ฆ„

 

$gte

db.movies.find({
  rating: {$gte: 8}
})

ํ‰์  8์  ์ด์ƒ(greater than or equal)

 

$gt, $lt

db.movies.find({
  year: {$gt: 2000, $lt: 2010}
})

2000๋…„ ์ดˆ๊ณผ 2010๋…„ ๋ฏธ๋งŒ (AND ์—ฐ์‚ฐ)

 

$or

db.movies.find({
  $or: [{
    rating: {$gt: 9}
  }, {year: {$gte: 2020}}]
})

OR ์—ฐ์‚ฐ

 

$in

db.movies.find({
  genres: {$in : ["Drama", "Crime"]}
})

ํฌํ•จ ์—ฌ๋ถ€(ํ•˜๋‚˜๋งŒ ๋“ค์–ด์žˆ์–ด๋„ ๋จ)

 

$all

db.movies.find({
  genres: {$all: ["Drama", "Crime"]}
})

๋ชจ๋‘ ํฌํ•จ๋˜์–ด์•ผ ํ•จ

 

$regex

db.movies.find({
  title: {$regex: /the/i}
})

the๊ฐ€ title์— ํฌํ•จ๋˜์–ด์•ผ ํ•จ

 

$size

db.movies.find({
  genres: {$size: 3}
})

genres ๋ฐฐ์—ด์˜ length๊ฐ€ 3์ด์–ด์•ผ ํ•จ

 

$exists

db.movies.find({
  director: {$exists: false}
})

director๋ผ๋Š” key๊ฐ€ ์—†์–ด์•ผ ํ•จ

 

Keanu Reeves๊ฐ€ ์ฒซ ๋ฒˆ์งธ cast์ธ ์˜ํ™” ์ฐพ๊ธฐ

db.movies.find({
  "cast.0": "Keanu Reeves"
})

"cast.0" -> cast์˜ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ผ๋Š” ๋œป

 

์ค‘์ฒฉ๋œ ๋ฌธ์„œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ํ™” ์ฐพ๊ธฐ

db.movies.find({
  "director.alive": true
})

"director.alive" -> ์ค‘์ฒฉ๋œ ๋ฌธ์„œ์ธ director์˜ alive ์†์„ฑ

sort, limit, skip

db.movies.find().sort({rating: -1, title: 1}).limit(10).skip(10)

rating์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , 10๊ฐœ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  10๊ฐœ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค

๋Œ€์‹  rating์ด ๊ฐ™๋‹ค๋ฉด ๋‹ค์Œ ์ •๋ ฌ ์ˆœ์€ title์ด๊ณ  ์•ŒํŒŒ๋ฒณ ์ˆœ์ด๋‹ค.

 

https://www.mongodb.com/ko-kr/docs/manual/reference/mql/query-predicates/#std-label-query-selectors

 

์ฟผ๋ฆฌ ์กฐ๊ฑด์ž - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งค๋‰ด์–ผ - MongoDB Docs

์ฟผ๋ฆฌ ์กฐ๊ฑด์ž๋Š” ๋ฌธ์„œ ์ง€์ •๋œ ์ฟผ๋ฆฌ ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ ๋ฅผ ๋“ค์–ด { name: { $eq: "Alice" } } ์€ "name" ํ•„๋“œ ๊ฐ’์ด ๋ฌธ์ž์—ด "Alice"์ธ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฟผ๋ฆฌ ์กฐ

www.mongodb.com

 

 

โœ… Update Document


updateOne

db.movies.updateOne({
  _id: ObjectId('69d4747cb86061dc24c503b5')
}, {
  $set: {
    'director.name': "Francing Ford Coppola"
  },
  $currentDate: {
    updated_at: true
  }
})

 

findOneAndUpdate

db.movies.findOneAndUpdate({
  _id: ObjectId('69d4747cb86061dc24c503b5')
}, {
  $set: {
    'director.name': "Francing Ford Coppola"
  },
  $currentDate: {
    updated_at: true
  }
}, {
  returnNewDocument: true,
  upsert: true
})

updateOneํ•˜๊ณ  ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋‚˜, findOneAndUpdate๋Š” ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์„ค์ •๋“ค์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

returnNewDocument๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋œ document๋ฅผ return, upsert๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด update, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด insertํ•œ๋‹ค.

 

$inc

db.movies.updateMany({
  director: "Christopher Nolan"
}, {
  $inc: {rating: 0.2}
})

rating์„ 0.2์”ฉ ์ฆ๊ฐ€ ์‹œํ‚ด(increment)

 

$push

db.movies.updateMany({
  title: "Inception"
},{
  $push: {genres: "Mind-Control"}
})

genres ๋ฐฐ์—ด์— "Mind-Control" ์ถ”๊ฐ€

 

$pull

db.movies.updateMany({
  title: "Inception"
},{
  $pull: {genres: "Mind-Control"}
})

 

$addToSet

db.movies.updateMany({
  title: "The Dark Knight"
}, {
  $addToSet: {cast: "Michael Cane"}
})

$push์™€ ๊ฐ™์ง€๋งŒ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.

 

$rename

db.movies.updateMany({}, {
  $rename: {runtime: "duration"}
})

schema ์†์„ฑ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ

 

Embedded Document์— ๋Œ€ํ•ด์„œ๋„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

db.movies.updateOne({
  title: "Inception"
}, {
  $set: {
    boxOffice: {
      domestic: 123412341234,
      international: 1231412412,
      worldwideTotal: 2342349893423
    }
  }
})

 

$unset

db.movies.updateMany({}, {
  $unset: {plot: ""}
})

plot ์†์„ฑ ์‚ญ์ œ

 

$expr, $each

db.movies.updateMany({
  $expr: {$lt: [{$size: "$genres"}, 3]}
}, {
  $addToSet: {genres: {$each: ["Other", "Happy"]}}
})

$expr์€ ๋” ๋ณต์žกํ•œ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

$each๋Š” ๋ฐฐ์—ด ์ž์ฒด๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐฐ์—ด์˜ ์›์†Œ ๊ฐ๊ฐ์„ ๋„ฃ๊ฒŒ ํ•ด์ค€๋‹ค.

$lt๋ฅผ ์ €๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด ๋‘ ๋ฒˆ์งธ ๊ฐ’๋ณด๋‹ค ์ž‘์„ ๋•Œ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

โœ… Delete Document


Update์™€ ์—ฐ์‚ฐ์ž๋“ค์€ ๋‹ค ๋น„์Šทํ•˜๋ฉฐ, deleteMany์™€ deleteOne์ด ์žˆ๋‹ค.

 

 

โœ… Aggregate Document


GROUP BY ์ ˆ๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

SQL์—์„œ GROUP BY ์ ˆ๊ณผ ์—ฌ๋Ÿฌ ์ง‘๊ณ„ํ•จ์ˆ˜๋“ค์„ ํ†ตํ•ด์„œ ํ–ˆ๋˜ ์ผ๋“ค์€ MongoDB์—์„œ๋Š” aggregate๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

$count

db.movies.aggregate([
  {$count: "total_movies"}
])

๋ชจ๋“  ์˜ํ™”์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ key ์ด๋ฆ„์„ "total_movies"๋กœ ์ง€์Œ

 

$group

db.movies.aggregate([
  {$group: {_id: null, avgRating: {$avg: "$rating"}}}
])

group key๋ฅผ ์ง€์ •ํ•ด์„œ group ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

(์ด ์ฝ”๋“œ์—์„œ๋Š” _id ๊ฐ’์— null์„ ์ฃผ์–ด์„œ ๋ชจ๋“  ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๋Š”๋‹ค.)

 

$unwind

db.movies.aggregate([
  {$unwind: "$genres"}
])

PostgreSQL์˜ unnest ํ•จ์ˆ˜๋ž‘ ๋น„์Šทํ•˜๋‹ค.

genres ๋ฐฐ์—ด์„ ํ’€์–ด์„œ ์›์†Œ๋ณ„๋กœ ๋ถ„๋ฆฌํ•ด ํ•œ ์˜ํ™”๋ฅผ genres๋ณ„๋กœ ๋‚˜๋ˆ„์–ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ document๋กœ ๋งŒ๋“ ๋‹ค.

db.movies.aggregate([
  {$unwind: "$genres"},
  {$group: {_id: "$genres", count: {$sum: 1}}},
  {$sort: {count: -1}}
])

genres๋ฅผ ๊ธฐ์ค€์œผ๋กœ group์‹œํ‚ค๊ณ , ๊ฐ document๋งˆ๋‹ค 1์”ฉ ๋”ํ•ด๋ผ.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ์ง‘๊ณ„๋œ count๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์„ ํ•œ๋‹ค.

 

$min, $max

db.movies.aggregate([
  {$group: {_id: null, oldestMovie: {$min: "$year"}, newestMovie: {$max: "$year"}, count: {$sum: 1}}},
])

 

$avg, $sort

db.movies.aggregate([
  {$group: {_id: "$year", avgDuration: {$avg: "$duration"}}},
  {$sort: {_id: -1}}
])

 

$match

db.movies.aggregate([
  {$match: {director: {$exists: true}}},
  {$group: {_id: "$director", movieCount: {$sum: 1}}},
  {$sort: {movieCount: -1}}
])

match๋Š” ํ•„ํ„ฐ๋ง ์—ญํ• 

 

$project, $limit

db.movies.aggregate([
  {$project: {title: 1, director: 1, cast: 1, _id: 0}},
  {$limit: 10}
])

$project๋Š” ๊ฐ€์ ธ์˜ฌ key๋“ค๋งŒ ์ง€์ • ๊ฐ€๋Šฅ(1์€ ์„ ํƒ, 0์€ ์„ ํƒ ์•ˆ ํ•จ), $limit์€ ๊ฐœ์ˆ˜ ์ œํ•œ

 

https://www.mongodb.com/ko-kr/docs/manual/reference/mql/aggregation-stages/

 

์• ๊ทธ๋ฆฌ๊ฒŒ์ด์…˜ ๋‹จ๊ณ„ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งค๋‰ด์–ผ - MongoDB Docs

db.collection.aggregate() ๋ฐ ๋ฉ”์„œ๋“œ์—์„œ db.aggregate() ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋Š” ๋ฐฐ์—ด ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. Atlas UI ์—์„œ ์ง‘๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋ฅผ ์ •๋ ฌ

www.mongodb.com

 

'๐ŸŒฑ MongoDB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

MongoDB - Mongoose  (0) 2026.04.14
MongoDB - MongoDB with Python  (0) 2026.04.13
MongoDB - Installation(macOS homebrew)  (0) 2026.04.07
'๐ŸŒฑ MongoDB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • MongoDB - Mongoose
  • MongoDB - MongoDB with Python
  • MongoDB - Installation(macOS homebrew)
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    API
    tailwindcss
    SQL
    PostgreSQL
    dev setup
    Next.js
    Prisma
    Firebase
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    0๋ ˆ๋ฒจ
    next.js 14
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    MySQL
    react router
    ๋ชจ๋”ฅ๋‹ค
    React Native
    Python
    mongoDB
    next.js 12
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
MongoDB - CRUD, Aggregate
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”