์„ค์น˜๋Š” ๊ณต์‹๋ฌธ์„œ, command๋Š” MongoDB In 30 Minutes by Traversy Media channel ์œ ํŠœ๋ธŒ ์˜์ƒ์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.

1. ์„ค์น˜(mac ver.)

๋งํฌ์— ๊ฐ„๋‹จํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ๋‚˜์™€์žˆ๋‹ค. community edition์„ ์„ค์น˜ํ•˜๋ฉด ๋˜๊ณ , ์„ค์น˜ํ•˜๊ธฐ ์ „ ๋งฅ ๊ธฐ์ค€์œผ๋กœ xcode, brew๊ฐ€ ๊น”๋ ค ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์œ„ ๋‘๊ฐœ๊ฐ€ ์„ค์น˜๋œ ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅํ•˜๋ฉด ์„ค์น˜๋˜๊ณ  ์ดํ›„ mongo๋ฅผ ์ž…๋ ฅํ•˜๋ฉด db๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

brew tap mongodb/brew
brew install mongodb-community@4.4

๋‚˜๋Š” xcode๋ฅผ ์“ฐ์ง€๋„ ์•Š๊ณ  ๊ดœํžˆ ์šฉ๋Ÿ‰๋งŒ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์ง€์šฐ๊ณ  ์žˆ๋‹ค๊ฐ€ ๊ณ„์† ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์•ฑ์Šคํ† ์–ด์—์„œ ๋‹ค์‹œ ๊น”์•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์™œ์ด๋ ‡๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š”์ง€...๐Ÿ˜‘

2. mongoDB

2.1 ํŠน์ง•

  • document type of nosql
  • stores data records as BSON documents. BSON is a binary representation of JSON document
  • don't need pre-defined structures like RDBMS's schema, tables, data type settings, etc
  • easy to scale
  • much faster in most types of operations
  • can have whatever fields you want, whatever documents you want

2.2 ๊ฐœ๋…

- collection

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ์œ ์‚ฌํ•œ ๊ฐœ๋…. Document & record๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

- document

ํ•˜๋‚˜์˜ record์ด๋ฉฐ, field:value๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. (์ด๋ฏธ์ง€ ์ถœ์ฒ˜: ๊ณต์‹๋ฌธ์„œ)

- ObjectId

uniqe value๋กœ์„œ document๋ฅผ ์ฐพ๋Š” ์šฉ๋„ ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค. ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ฒ˜๋Ÿผ auto-increment๋˜๋Š” primary key๊ฐ€ ์—†์–ด๋„ ๋˜๋Š” ์ด์œ !

- object & array

python์„ ์“ฐ๋‹ค๊ฐ€ ๋ณด๋‹ˆ๊นŒ ํ—ท๊ฐˆ๋ ค์„œ, {}๊ฐ€ ๊ฐ์ฒด=object, []๊ฐ€ ๋ฐฐ์—ด=array๋‹ค.

3. command

3.1 CRUD

db.createUser() ๊ด€๋ จ ๊ณต์‹ ๋ฌธ์„œ ์„ค๋ช…, ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  key๊ฐ’์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ์„œ ๊ตฌ์„ฑํ•˜๋ฉด ๋จ!

// user ๋งŒ๋“ค๊ธฐ
> db.createUser({
... user:"yeni",
... pwd:"1234",
... roles: ["readWrite", "dbAdmin"]
... });

// collection ์ƒ์„ฑ
> db.createCollection('customers'); 
{ "ok" : 1 }

// collections ์กฐํšŒ
> show collections 
customers

- insert

// ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ
> db.customers.insert({first_name:"Yeeun", last_name:"Lee"}); 
WriteResult({ "nInserted" : 1 })


// ๋ณต์ˆ˜์˜ ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ: array ์•ˆ์—! 
> db.customers.insert([{first_name:"John", last_name:"Doe"}, 
                      {first_name:"Steven", last_name:"Smith", gender:"male"}]);
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})

upsert

์—†๋Š” field๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๊ฒฝ์šฐ ์•„๋ฌด ๊ฒฐ๊ณผ๋„ ๋ฐ˜์˜๋˜์ง€ ์•Š์ง€๋งŒ, upsert option์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

> db.customers.update({first_name:"Mary"}, 
                      {first_name:"Mary", last_name:"Samson"},
                      {upsert:true}); // upsert = true ์„ค์ •
WriteResult({
	"nMatched" : 0,
	"nUpserted" : 1,
	"nModified" : 0,
	"_id" : ObjectId("5f32758fbf762656882f2068")
})

> db.customers.find().pretty();
{
	"_id" : ObjectId("5f32758fbf762656882f2068"),
	"first_name" : "Mary",
	"last_name" : "Samson"
}

- find

// ์กฐํšŒ 
> db.customers.find();
{ "_id" : ObjectId("5f325e13a7405fe8dbb33b91"), "first_name" : "Yeeun", "last_name" : "Lee" }

// ์˜ˆ์˜๊ฒŒ(?) ์กฐํšŒ 
> db.customers.find().pretty();
{
	"_id" : ObjectId("5f325e13a7405fe8dbb33b91"),
	"first_name" : "Yeeun",
	"last_name" : "Lee"
}

// ์ด๋ฆ„์ด Yeeun์ธ ๊ณ ๊ฐ ์ฐพ์•„์ค˜
> db.customers.find({first_name:"Yeeun"}).pretty();
{
	"_id" : ObjectId("5f325e13a7405fe8dbb33b91"),
	"first_name" : "Yeeun",
	"last_name" : "Lee",
	"gender" : "female"
}

- update

์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์„ ์“ฐ๋ฉด first_name์ด John์ธ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊ฟ”๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณดํ†ต Unique value๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, first_name John์ด ์ค‘๋ณต๋˜์ง€ ์•Š๊ณ  ์žˆ์–ด ๊ฐ•์˜์—์„œ๋Š” first_name์œผ๋กœ record๋ฅผ ์„ ํƒํ–ˆ๋‹ค.

// first_name์ด John์ธ record๋ฅผ ๋‹ค์Œ {}๋กœ ๋ฐ”๊ฟ”์ค˜! 
> db.customers.update({first_name:"John"}, 
                      {first_name:"John", last_name:"Doe", gender:"male"});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.customers.find().pretty();
{
	"_id" : ObjectId("5f3261fca7405fe8dbb33b92"),
	"first_name" : "John",
	"last_name" : "Doe",
	"gender" : "male" // ์„ฑ๋ณ„์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. 
}

- remove

์•„๋ž˜ ํŠน์ • field๋ฅผ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น key, value๋ฅผ ๊ฐ€์ง„ record๊ฐ€ ์ง€์›Œ์ง€๊ณ , ๋นˆ curly bracket์„ ๋„ฃ์œผ๋ฉด collection ์ „์ฒด๊ฐ€ ์ง€์›Œ์ง„๋‹ค.

> db.customers.remove({first_name:"John"});
WriteResult({ "nRemoved" : 1 })

with parameter

์ง€์šธ ๋•Œ ํ•˜๋‚˜๋งŒ ์ง€์šฐ๋Š” ์˜ต์…˜

> db.customers.remove({first_name:"Steven"}, {justOne:true});
WriteResult({ "nRemoved" : 0 })

3.2 operators

๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ  โœ”๏ธ

- Query and Projection Operators

logical

  • and
  • not
  • nor
  • or
// ์ด๋ฆ„์ด Yeeun์ด๊ฑฐ๋‚˜ John์ธ ๊ณ ๊ฐ ์ฐพ์•„์ค˜ 
> db.customers.find( {$or:[{first_name:"Yeeun"}, {first_name:"John"}]} ).pretty();
{
	"_id" : ObjectId("5f325e13a7405fe8dbb33b91"),
	"first_name" : "Yeeun",
	"last_name" : "Lee",
	"gender" : "female"
}
{
	"_id" : ObjectId("5f3261fca7405fe8dbb33b92"),
	"first_name" : "John",
	"last_name" : "Doe",
	"gender" : "male"
}

comparison

  • $gt: greater than
  • $gte: greater than or equal to
  • $lt: less than
  • $lte: less than or equal to
// ๋‚˜์ด๊ฐ€ 35๋ณด๋‹ค ํฐ ๊ณ ๊ฐ ์ฐพ์•„์ค˜ 
> db.customers.find({age:{$gt:35}}).pretty(); // greater than
{
	"_id" : ObjectId("5f32758fbf762656882f2068"),
	"first_name" : "Mary",
	"last_name" : "Samson",
	"gender" : "female",
	"age" : 40
}

// ๋‚˜์ด๊ฐ€ 35๋ณด๋‹ค ์ž‘์€ ๊ณ ๊ฐ ์ฐพ์•„์ค˜ 
> db.customers.find({age:{$lt:35}}).pretty(); // less than
{
	"_id" : ObjectId("5f325e13a7405fe8dbb33b91"),
	"first_name" : "Yeeun",
	"last_name" : "Lee",
	"gender" : "female",
	"age" : 30
}

- Update Operators

$set

update์—์„œ record ์„ ํƒ ํ›„ ๋ชจ๋“  key, value๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ $set์„ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” key, value๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

> db.customers.update({first_name:"Yeeun"}, {$set:{gender:"female"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.customers.find().pretty();
{
	"_id" : ObjectId("5f325e13a7405fe8dbb33b91"),
	"first_name" : "Yeeun",
	"last_name" : "Lee",
	"gender" : "female" // ์„ฑ๋ณ„๋งŒ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
}

$unset

ํŠน์ • field๋ฅผ ์ง€์›Œ์ค€๋‹ค. 1์€ json/bson syntax๋กœ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋Š” ์—†๊ณ  value๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ๋„ฃ์–ด์ค€ ๊ฒƒ(typicaly use)์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.


// age field ์‚ญ์ œ
> db.customers.update({first_name:"Yeeun"}, {$unset:{age:1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.customers.find().pretty();
{
	"_id" : ObjectId("5f325e13a7405fe8dbb33b91"),
	"first_name" : "Yeeun",
	"last_name" : "Lee",
	"gender" : "female"
}

3.3 advanced

- javascript function

๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค ๐Ÿ˜ฎ sql๋„ ์ฐพ์•„๋ณด๋ฉด ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๊ฒ ์ง€๋งŒ, javascript ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‹ค๋ณด๋‹ˆ javascript function์„ ์จ์„œ ์ข€ ์‹ ๊ธฐ...!

> db.customers.find().forEach(function(doc){print("Customer Name:" + doc.first_name)});
Customer Name:Yeeun
Customer Name:John
Customer Name:Mary

- value ์•ˆ์˜ value ์ฐพ๊ธฐ

address key ์•ˆ์— ๋˜ object๊ฐ€ ์žˆ๋Š”๋ฐ, ์š”๊ฑฐ๋ฅผ Dot notation์œผ๋กœ ์ ‘๊ทผ! key๊ฐ’์—๋„ ""(quote)๋ฅผ ์“ฐ๋Š” client๋‚˜ program์ด ์žˆ์œผ๋‹ˆ ํ™•์ธํ•˜๊ณ  ์“ธ ๊ฒƒ

> db.customers.find({"address.state":"MA"}).pretty();
{
	"_id" : ObjectId("5f325e13a7405fe8dbb33b91"),
	"first_name" : "Yeeun",
	"last_name" : "Lee",
	"gender" : "female",
	"age" : 30,
	"address" : {
		"street" : "411 Blue st",
		"city" : "Boston",
		"state" : "MA"
	}
}

- ์ˆซ์ž value ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ

์ˆซ์ž value๋ฅผ update command๋ฅผ ํ†ตํ•ด ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• !

> db.customers.update({first_name:"Yeeun"}, {$inc:{age:1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.customers.find().pretty();
{
	"_id" : ObjectId("5f325e13a7405fe8dbb33b91"),
	"first_name" : "Yeeun",
	"last_name" : "Lee",
	"gender" : "female",
	"age" : 31
}
{
	"_id" : ObjectId("5f3261fca7405fe8dbb33b92"),
	"first_name" : "John",
	"last_name" : "Doe",
	"gender" : "male"
}
{
	"_id" : ObjectId("5f3261fca7405fe8dbb33b93"),
	"first_name" : "Steven",
	"last_name" : "Smith",
	"gender" : "male"
}

- key๊ฐ’ ๋ฐ”๊พธ๊ธฐ

> db.customers.update({first_name:"Steven"}, 
                      {$rename: {"gender":"sex"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.customers.find().pretty();
{
	"_id" : ObjectId("5f3261fca7405fe8dbb33b93"),
	"first_name" : "Steven",
	"last_name" : "Smith",
	"sex" : "male" // key๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋‹ค
}

- sorting

sort parameter์˜ value์—์„œ 1์€ ascending, -1์€ descending option

> db.customers.find().sort({first_name:1});

- ๊ทธ ์™ธ

  • db.customers.find().limit(4); : 4๊ฐœ๋งŒ ๋ณด์—ฌ์ค˜
  • db.customers.find().count(); : ๋ช‡๊ฐœ์•ผ?
profile
์ด์‚ฌ๊ฐ„ ๋ธ”๋กœ๊ทธ: yenilee.github.io

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN