TIL 55: [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] NoSQL

SQL์ด ๋‚˜์˜ค๊ณ  ๋‚˜์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ํญ๋ฐœ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ–ˆ๋˜ SQL ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด NoSQL์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. NoSQL ์ข…๋ฅ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  • key-value stores: Redis, Amazon Dynamo DB
  • column stores: HBase, Cassandra
  • document stores: Mongo DB, Couchbase
  • graph databases: Neo4J
  • search engines: Solr, ElasticSearch, Splunk

 

MongoDB๋Š” ๋Œ€ํ‘œ์ ์ธ NoSQL ๋„ํ๋จผํŠธ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. ๋„ํ๋จผํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ, ๋ฌธ์„œ์ฒ˜๋Ÿผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. JSON๊ณผ ์œ ์‚ฌํ•œ ํ˜•์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•„๋“œ-๊ฐ’์˜ ํ˜•ํƒœ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ปฌ๋ ‰์…˜์ด๋ผ๊ณ  ํ•˜๋Š” ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

NoSQL ๊ธฐ๋ฐ˜์˜ ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์‚ฌ์šฉ ์ผ€์ด์Šค

์ด์ „์— ๋ฐฐ์› ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ NoSQL์€ ๋น„๊ตฌ์กฐ์ /๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋น„๊ตฌ์กฐ์ ์ธ ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ
  • ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ๋ฐ ์ €์žฅ๊ณต๊ฐ„์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: ์ˆ˜์ง์  ํ™•์žฅ์œผ๋กœ DB๋ฅผ ์ฆ์„คํ•˜๋Š” SQL๊ณผ ๋‹ฌ๋ฆฌ ์ˆ˜ํ‰์  ํ™•์žฅ์˜ ํ˜•ํƒœ๋กœ ์ฆ์„คํ•˜๋ฏ€๋กœ, ์ด๋ก ์ƒ ๋ฌดํ•œ๋Œ€๋กœ ์„œ๋ฒ„๋ฅผ ๊ณ„์† ๋ถ„์‚ฐ์‹œ์ผœ DB๋ฅผ ์ฆ์„คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น ๋ฅด๊ฒŒ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ž์ฃผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒฝ์šฐ
  • MongoDB์˜ ๊ฒฝ์šฐ, ํ•˜๋‚˜์˜ Primary์™€ ๋‘ ๊ฐœ์˜ Secondary๋กœ ์ด๋ฃจ์–ด์ง„ ๋ ˆํ”Œ๋ฆฌ์นด ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•๋ถ„์— ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ fault๊ฐ€ ๋˜์–ด๋„ ์‚ฌ์šฉ์ž๋“ค์ด ์•ˆ์ •์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ณ ๊ฐ€์šฉ์„ฑ)

 

์šฉ์–ด ์ •๋ฆฌ

์ƒˆ๋กœ์šด ์šฉ์–ด๋“ค์ด ๋งŽ์ด ๋‚˜์™€ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ ˆํ”Œ๋ฆฌ์นด ์„ธํŠธ
    ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ช‡ ๊ฐœ์˜ ์—ฐ๊ฒฐ๋œ MongoDB ์ธ์Šคํ„ด์Šค์˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

  • ์ธ์Šคํ„ด์Šค
    ํŠน์ • ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋กœ์ปฌ ๋˜๋Š” ํด๋ผ์šฐ๋“œ ๋‹จ์ผ ๋จธ์‹ ์œผ๋กœ, ํด๋ผ์šฐ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋Ÿฌ์Šคํ„ฐ
    ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์„œ๋ฒ„ ๊ทธ๋ฃน์œผ๋กœ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋‹จ์ผ ์ปดํ“จํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋„๋ก ์ œ์ž‘ํ•œ ์ปดํ“จํ„ฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

  • ๋„ํ๋จผํŠธ / ํ•„๋“œ / ๊ฐ’
    ํ•„๋“œ-๊ฐ’ ์Œ์œผ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ / ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ์œ„ํ•œ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž / ์ฃผ์–ด์ง„ ์‹๋ณ„์ž์™€ ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ

  • ์ปฌ๋ ‰์…˜
    MongoDB์˜ ๋„ํ๋จผํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋„ํ๋จผํŠธ ๊ฐ„์˜ ๊ณตํ†ต ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‹น ๋งŽ์€ ์ปฌ๋ ‰์…˜์ด ์žˆ๊ณ , ์ปฌ๋ ‰์…˜ ๋‹น ๋งŽ์€ ๋„ํ๋จผํŠธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

BSON

BSON์€ Binary JSON์˜ ์•ฝ์ž๋กœ ์ด์ง„๋ฒ•์— ๊ธฐ๋ฐ˜์„ ๋‘” ํ‘œํ˜„๋ฒ•์ž…๋‹ˆ๋‹ค. JSON์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

JSON์˜ ํ•œ๊ณ„๋กœ๋Š” ํ…์ŠคํŠธ ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฝ๊ธฐ ์‰ฝ์ง€๋งŒ, ํŒŒ์‹ฑ์ด ๋А๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

BSON์€ ์•ž์„œ ๋งํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ด์ง„๋ฒ•์— ๊ธฐ๋ฐ˜์„ ๋‘์—ˆ๊ธฐ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ํšจ์œจ์ ์ด๋ฉฐ, ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ BSON๊ณผ JSON์˜ ํŠน์ง•์„ ์‚ด๋ ค MongoDB์˜ ๋ฐ์ดํ„ฐ๋Š” BSON์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๊ณ , ๋ณดํ†ต ์ฝ๊ธฐ ์‰ฌ์šด JSON์˜ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

 

 

Exporting & Importing

JSON BSON
mongoexport mongorestore
mongoimport mogodump

 

<export>
mongodump --uri "mongodb+srv://<your username>:<your password>@<your cluster>.mongodb.net/database_name">
		"<Atlas Cluster URI>"
                
mongoexport --uri "<Atlas Cluster URI>"
			--collection=<collection name>
            --out=<filename>.json
            // ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ผ ๋•Œ๋Š” ๋‚ด๋ณด๋‚ผ ์ปฌ๋ ‰์…˜๊ณผ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ •ํ™•ํžˆ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
            


<import>
mongostore --uri "<Atlas Cluster URI>"
	   --drop dump
           
mongoimport --uri "<Atlas Cluster URI>"
	    --drop=<filename>.json

 

 

CRUD

์–‘์ด ๋งŽ์•„ ์ฃผ์š” ๋ฌธ๋ฒ• ์œ„์ฃผ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

Create

db.inspections.insert([{ "id" : "1", "test" : "1" }, { "id" : "1", "test" : "2" }, { "id" : "3", "test" : "3" }], { "ordered": false })
// The first object and third object will be inserted due to "ordered" that ignores orders.

์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅ๋˜๋Š” ํŠน์ง• ๋•Œ๋ฌธ์— ๋„ํ๋จผํŠธ ๊ฐ„ ์ถฉ๋Œ์ด ์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น ๋„ํ๋จผํŠธ ์ดํ›„ ์ˆœ์„œ์˜ ์ •์ƒ์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง•์ด ์ ์šฉ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” "ordered" ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

Read

show dbs

use DB๋ช…                                                      

ex) use sample_training

show collections                                          

ํ•ด๋‹น DB ์•ˆ์— ์žˆ๋Š” ์ปฌ๋ ‰์…˜๋“ค์ด ๋ชจ๋‘ ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.

db.collection_name.find(<์ฟผ๋ฆฌ๋ฌธ>)            

ex) db.zips.find({"state":"NY"})

 

find๋ฅผ ํ†ตํ•ด ์กฐํšŒ๋˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์˜ ๊ฐœ์ˆ˜๊ฐ€ 20๊ฐœ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ ๋žœ๋ค ํ•˜๊ฒŒ ์„ ํƒ๋œ ์ด 20๊ฐœ ๊ฒฐ๊ณผ๋ฌผ๋งŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์กฐ๊ฑด์— ๋งž๋Š” ๋‹ค์Œ 20๊ฐœ์˜ ๋„ํ๋จผํŠธ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” iterate์˜ ์ค„์ž„๋ง์ด it ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด, find(<์ฟผ๋ฆฌ๋ฌธ 1, ์ฟผ๋ฆฌ๋ฌธ 2>)์˜ ํ˜•ํƒœ๋กœ ์ ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์กฐ๊ฑด ์ฟผ๋ฆฌ๋ฌธ ์—†์ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ex) db.zips.find

pretty( )๋Š” ๋„ํ๋จผํŠธ์˜ ๊ตฌ์กฐ์™€ ๊ฐ ํ•„๋“œ, ๊ฐ’์˜ ์Œ์„ ์กฐ๊ธˆ ๋” ์ฝ๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.    ex) db.zips.find( ).pretty( ) 

count( )๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.                                                    ex) db.zips.find( ).count( )

findOne( )์€ 1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.                                                     ex) db.zips.findOne({" ")})

 

 

Update

update๋„ ์ฃผ์–ด์ง„ ์ฟผ๋ฆฌ๋ฌธ์— ๋งž๋Š” ์ฒซ ๋ฒˆ์งธ ๋„ํ๋จผํŠธ ํ•˜๋‚˜๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” updateOne( ), ์ฟผ๋ฆฌ๋ฌธ๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋„ํ๋จผํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” updateMany( ) 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์šฐํŽธ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ถ„๋œ ALPINE ์‹œ์˜ ์ง€์—ญ ์ธ๊ตฌ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

db.zips.updateMany({ "city" : "ALPINE" }, { "$inc" : { "pop" : 10 } } )

 

updateMany์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ์–ด๋–ค ๋„ํ๋จผํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ• ์ง€ ๊ฒฝ์ •ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ธ์ž์—๋Š” ๋ฐœ์ƒํ•  ์—…๋ฐ์ดํŠธ ๋‚ด์šฉ์„ ํŠน์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ $inc๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํŠน์ • ํ•„๋“œ์˜ ๊ฐ’์„ ์›ํ•˜๋Š” ๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๋„ํ๋จผํŠธ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” matchedCount์™€, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ„ ์—…๋ฐ์ดํŠธ ์—ฐ์‚ฐ์ž๋กœ ์ธํ•ด ์ˆ˜์ •๋œ ๋„ํ๋จผํŠธ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” modiefiedCount๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์‘๋‹ต์ด ์˜ต๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ ค ํ•œ๋‹ค๋ฉด $inc๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๊ฒ ์ง€๋งŒ, 100,000,000์—์„œ 5,325,678๋กœ ์ค„์ด๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์ผ์ผ์ด ๊ณ„์‚ฐํ•˜๊ธฐ ๋ณต์žกํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ $set์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

db.zips.updateOne({ "zip" : "12534" }, { "$set" : {"pop" : 6235} } )

 

$push ์—ฐ์‚ฐ์ž๋Š” ๋ฐฐ์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ํ•„๋“œ์˜ ๊ฐ’์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ๋ธŒ ๋„ํ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

db.grades.updateOne({ "student_id" : 250, "class_id" : 339 }, { "$push" : { "scores" : { "type" : "extra credit", "score" : 100 } } } )

 

 

 

Delete

delete์—๋Š” ํ•˜๋‚˜์˜ ๋„ํ๋จผํŠธ๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ๋Š” deleteOne( )๊ณผ ์—ฌ๋Ÿฌ ๋„ํ๋จผํŠธ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” deleteMany( )๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

๋„ํ๋จผํŠธ๊ฐ€ ์•„๋‹Œ ์ปฌ๋ ‰์…˜์„ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” drop์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ์ปฌ๋ ‰์…˜์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

db.collection_name.drop( )

 

Advanced

๋น„๊ต ์—ฐ์‚ฐ์ž

$eq (equal to)

$ne (not equal to)

$gt (greater than)

$lt (less than)

$gte (greater than or equal to)

$lte (less than or equal to)

 

{ <feld> : { <operator> : <value> } }           

ex)  db.trips.find ( { "tripduration" : {"$lte" : 70}, "usertype" : "Customer" } ) 

usertype์ด Customer์ธ ์ž๋ฃŒ๋ฅผ ๊ตฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ $eq๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ $eq๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž

$and     $eq์ฒ˜๋Ÿผ ์ƒ๋žต ๊ฐ€๋Šฅ

$or

$nor      ์ฃผ์–ด์ง„ ๋ชจ๋“  ์ฟผ๋ฆฌ์ ˆ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๊ฐ€

 

$not      ์ฃผ์–ด์ง„ ์ฟผ๋ฆฌ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๊ฐ€

 

$and, $or ๋ฐ $nor๋Š” ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์—ฐ์‚ฐ์ž๊ฐ€ ์ž‘๋™ํ•  ์ ˆ์˜ ๋ฐฐ์—ด ์•ž์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

 

$not์€ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋‹จ์ˆœํžˆ ๋’ค์— ์˜ค๋Š” ์กฐ๊ฑด์„ ๋ถ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

ํ‘œํ˜„ ์—ฐ์‚ฐ์ž

ํ‘œํ˜„ ์—ฐ์‚ฐ์ž($expr)๋ฅผ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋กœ ์ฟผ๋ฆฌ ๋‚ด์—์„œ ์ง‘๊ณ„ ํ‘œํ˜„์‹(Aggregation Expression)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ { $expr : { expression } } ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋กœ $expr๋ฅผ ์ด์šฉํ•ด ๋ณ€์ˆ˜์™€ ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ $expr๋ฅผ ์ด์šฉํ•ด ๊ฐ™์€ ๋„ํ๋จผํŠธ ๋‚ด์˜ ํ•„๋“œ๋“ค์„ ์„œ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ™์€ ๋„ํ๋จผํŠธ ๋‚ด์— ํ•„๋“œ๋“ค์„ ๋น„๊ตํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

{ "$expr" : { "$eq" : [ "$start station id", "$end station id" ] } }

 

start station id์™€ end station id์˜ ๊ฐ’์ด ๋™์ผํ•œ์ง€๋ฅผ ํ™•์ธํ•ด์ฃผ๋Š” ์ฟผ๋ฆฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋•Œ $์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํ•ด๋‹น ํ•„๋“œ์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ start station id์˜ ๊ฐ’์ด 439๋ผ๋ฉด $start station id๋ฅผ ํ†ตํ•ด 439๋ผ๋Š” ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋ฐฐ์—ด ์—ฐ์‚ฐ์ž

$push ๋ฐฐ์—ด ์—ฐ์‚ฐ์ž๋Š” ๋ฐฐ์—ด์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ด์ „์— ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ’์ด์—ˆ๋˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ๋ฐฐ์—ด ํƒ€์ž…์˜ ํ•„๋“œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$size ๋ฐฐ์—ด ์—ฐ์‚ฐ์ž๋Š” ์ง€์ •๋œ ๋ฐฐ์—ด ํ•„๋“œ๊ฐ€ ์ฃผ์–ด์ง„ ๊ธธ์ด์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋„ํ๋จผํŠธ๋“ค์ด ์žˆ๋Š” ์ปค์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

$all ๋ฐฐ์—ด ์—ฐ์‚ฐ์ž๋Š” ์ง€์ •๋œ ๋ฐฐ์—ด ํ•„๋“œ์˜ ๋ฐฐ์—ด ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†์ด ์ง€์ •๋œ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ๋„ํ๋จผํŠธ๋“ค์ด ์žˆ๋Š” ์ปค์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

Aggregation Framework

Aggregation Framework๋Š” MongoDB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌ ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 

aggregate๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„ํ๋จผํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ฃน์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์ฒ˜๋Ÿผ ๋ฐฐ์—ด ์š”์†Œ์˜ ์ˆœ์„œ๋Œ€๋กœ ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค. 

$group์€ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ listingAndReviews ์ปฌ๋ ‰์…˜์—์„œ ๊ตญ๊ฐ€ ์ด๋ฆ„๊ณผ ๊ทธ ์ˆ˜์˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด 

 

db.listingsAndReviews.aggregate( [ { $project : { "address" : 1, "_id" : 0 } }, { $group : { _id  : "$address.country", "count" : { "$sum" : 1 } } } ] )

 

์œ„์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $group ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด address.country ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž์—์„œ๋Š” $group์—์„œ $sum ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๊ตญ๊ฐ€๋งˆ๋‹ค ๋ช‡ ๊ฐœ์˜ ์ˆ™์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.