์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•ด์ฃผ์„ธ์š”

MongoDB

 ·  โ˜• 4 min read · ๐Ÿ‘€... ์กฐํšŒ์ˆ˜

์ธํ”„๋Ÿฐ์—์„œ Node.js React.js๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ ์žˆ๋Š”๋ฐ ๊ทธ ๊ฐ•์˜์—์„œ MongoDB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ• ๊ฒธ ํฌ์ŠคํŒ…์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด์ „์— ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ mysql, oracle๊ณผ ๋‹ค๋ฅธ nosql
์‹œ์Šคํ…œ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ๋ฒ•๋„ ๋‹ค๋ฅด๊ณ  ๊ฐœ๋…๋„ ๋‹ค๋ฅด๊ธฐ์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ, ์ต์ˆ™ํ•ด์ง€๋ฉด ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

MongoDB๋ž€?

๋ชฝ๊ณ DB๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋„ํ๋จผํŠธ ์ง€ํ–ฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด๋‹ค. NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ถ„๋ฅ˜๋˜๋Š” ๋ชฝ๊ณ DB๋Š” JSON๊ณผ ๊ฐ™์€ ๋™์  ์Šคํ‚ค๋งˆํ˜• ๋„ํ๋จผํŠธ๋“ค์„ ์„ ํ˜ธํ•จ์— ๋”ฐ๋ผ ์ „ํ†ต์ ์ธ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ์˜
์‚ฌ์šฉ์„ ์‚ผ๊ฐ„๋‹ค.

์ฐธ์กฐ : https://ko.wikipedia.org/wiki/%EB%AA%BD%EA%B3%A0DB

MongoDB method~

save

save๋Š” MongDB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. save๋ง๊ณ ๋„ insert ๋“ฑ์ด ์žˆ๋‹ค.

์‚ฌ์šฉ์˜ˆ์ œ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
router.post('/', (req, res) => {
    //๊ฐ€์ ธ์˜จ ์ •๋ณด๋“ค์„ db์— ๋„ฃ์–ด์ค€๋‹ค.
    //๊ฐ€์ ธ์˜จ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
    const product = new Product(req.body)
    //๊ทธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  DB์— ์ €์žฅํ•œ๋‹ค.
    product.save((err) => {
        if (err) return res.status(400).json({success: false, err})
        return res.status(200).json({success: true})
    })

})

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ์Šคํ‚ค๋งˆ์— body๋ฅผ ๋‹ด์•„ save๋ฅผ ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

find

find๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์กฐํšŒ ๋ฉ”์†Œ๋“œ์ด๋‹ค. find({}) ๋˜๋Š” find()๋ฅผ ํ•˜๋ฉด ์ปฌ๋ ‰์…˜ ๋‚ด์— ๋ชจ๋“  ๋‹คํ๋จผํŠธ๋“ค์„ ์„ ํƒํ•˜์—ฌ ๊ฐ€์ ธ์˜จ๋‹ค.

์‚ฌ์šฉ์˜ˆ์ œ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
//๊ธฐ๋ณธ์˜ˆ์ œ
Product.find({})

//๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์‰ผํ‘œ๋กœ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž‘์„ฑํ•œ๋‹ค.
Product.find({name: 'test', job: '๊ฐœ๋ฐœ์ž'})

//ํ•œ๊ฐ€์ง€๋งŒ ์ผ์น˜ํ•ด๋„๋˜๋Š” ๊ฒฝ์šฐ๋Š” $or๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
Product.find({$or: [{name: 'test'}, {job: '๊ฐœ๋ฐœ์ž'}]})

//์‹ค์ œ์˜ˆ์ œ
router.post('/products', (req, res) => {
    //product collection์— ๋“ค์–ด์žˆ๋Š” ๋ชจ๋“  ์ƒํ’ˆ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    //์กฐ๊ฑด์€ Product.find({price:..}) ์ด๋Ÿฐ์‹์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
    Product.find()
        .populate('writer')
        .exec((err, productInfo) => {
            if (err) return res.status(400).json({success: false, err})
            return res.status(200).json({success: true, productInfo})
        })

})

์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ๋Œ€์ถฉ ํŒŒ์•…ํ–ˆ๋“ฏ์ด find๋ฉ”์†Œ๋“œ์•ˆ์— jsonํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ˆซ์ž๋น„๊ต ์˜ต์…˜

ํฐ ๊ฒƒ์€ $gt, ์ž‘์€๊ฒƒ์€ $lt, ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€๊ฒƒ์€ $gte, ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒƒ์€ $lte์ด๋‹ค.

์‚ฌ์šฉ์˜ˆ์ œ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
router.post('/products', (req, res) => {
    //product collection์— ๋“ค์–ด์žˆ๋Š” ๋ชจ๋“  ์ƒํ’ˆ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    //์กฐ๊ฑด์€ Product.find({price:..}) ์ด๋Ÿฐ์‹์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

    let limit = req.body.limit ? parseInt(req.body.limit) : 20
    let skip = req.body.skip ? parseInt(req.body.limit) : 0

    //์กฐ๊ฑด์‹์„ ๋งŒ๋“ค์–ด์ค˜์•ผํ•˜๊ธฐ์— ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
    let findArgs = {}

    //์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฐฐ์—ด์•ˆ์˜ ๋ฐฐ์—ด ์ฆ‰, price๋‚˜ continents๊ฐ€ key๊ฐ€ ๋œ๋‹ค.
    for (let key in req.body.filters) {
        //๋ฐฐ์—ด์— ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์•„๋ž˜๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
        if (req.body.filters[key].length > 0) {
            //์กฐ๊ฑด์‹์„ ๋„ฃ์–ด์ฃผ๋Š” ๋ถ€๋ถ„์ด๋‹ค.
            if (key === 'price') {
                findArgs[key] = {
                    //๊ฐ’์€ [0.199] ์ด๋Ÿฐ์‹์œผ๋กœ ๋“ค์–ด์˜จ๋‹ค.
                    //greater than equal -> ์ด๊ฒƒ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ 
                    $gte: req.body.filters[key][0],
                    //less than equal => ์ด๊ฒƒ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๊ณ 
                    $lte: req.body.filters[key][1]
                }
            } else {
                //๊ทธ๊ฒŒ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ๊ฐ’์œผ๋กœ find๋•Œ๋ ค๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„๋„ฃ์–ด๋ฒ„๋ฆผ
                findArgs[key] = req.body.filters[key];
            }

        }
    }

    console.log(findArgs)

    Product.find(findArgs)
        .populate('writer')
        .skip(skip)
        .limit(limit)
        .exec((err, productInfo) => {
            if (err) return res.status(400).json({success: false, err})
            return res.status(200).json({success: true, productInfo, postSize: productInfo.length})
        })

})

ํˆฌ์‚ฌ(projection)

ํˆฌ์‚ฌ(projection)์ด๋ž€ find์™€ findOne ๋ฉ”์†Œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. select ์ ˆ์— ์ปฌ๋Ÿผ์„ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ์ด๋‹ค. projection ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์šฉ๋Ÿ‰๋„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๊ณ ,
๋ณด์•ˆ์—๋„ ์ข‹๋‹ค.

1
Product.find({name: 'Slime'}, {name: true, hp: true, _id: false})

update

์—…๋ฐ์ดํŠธ๋Š” ๋ณดํ†ต update๋‚˜ FindAndModify๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

####update

1
Product.update({name : 'test'}, { $set : { hp : 30}})

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜ํ–‰๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋“œ์‹œ $set์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด๋‹น ํ•„๋“œ๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค.
๋งŒ์•ฝ $set์„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด, ๊ฐ์ฒด๊ฐ€ {hp : 30}์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

$inc๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆซ์ž๋ฅผ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์Œ์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด ๋‚ด๋ ค๊ฐ€๊ณ  ์–‘์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด ์˜ฌ๋ผ๊ฐ„๋‹ค.

1
Product.update({name : 'test'}, { $inc : { hp : -5 }})

####FindAndModify
update ๋ฉ”์†Œ๋“œ์™€ ๋‹ฌ๋ฆฌ upsert์™€ remove๊นŒ์ง€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • upsert -> update + insert์ด๋‹ค.
    ์ˆ˜์ •ํ•  ๋Œ€์ƒ์ด ์—†๋Š” ๊ฒฝ์šฐ insert ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.
  • upsert ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฉ”์†Œ๋“œ์— ์˜ต์…˜์œผ๋กœ {upsert : true}๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
1
Product.findAndModify({query : {name : 'test'}, update : {$set : {att : 150}, new : true}})

delete

MongoDB๋Š” Rollback์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

1
2
3
4
5
//์ „์ฒด๊ฐ€ ์ง€์›Œ์ง
Product.remove({})

//ํ•ด๋‹นํ•˜๋Š” ์ด๋ฆ„์˜ ๋„ํ๋จผํŠธ๋งŒ ์ง€์›Œ์ง
Product.remove({name : 'zedd'})
๊ณต์œ ํ•˜๊ธฐ

brinst
๊ธ€์“ด์ด
brinst
Backend Developer

๋ชฉ์ฐจ