설치는 공식문서, command는 MongoDB In 30 Minutes by Traversy Media channel 유튜브 영상을 참고했다.
링크에 간단한 가이드가 나와있다. community edition을 설치하면 되고, 설치하기 전 맥 기준으로 xcode, brew가 깔려 있어야 한다.
위 두개가 설치된 것을 기준으로 아래 명령어를 터미널에 입력하면 설치되고 이후 mongo
를 입력하면 db를 실행할 수 있다.
brew tap mongodb/brew
brew install mongodb-community@4.4
나는 xcode를 쓰지도 않고 괜히 용량만 차지하는 것 같아서 지우고 있다가 계속 오류가 발생했다. 앱스토어에서 다시 깔았는데 시간이 왜이렇게 오래 걸리는지...😑
관계형 데이터베이스의 테이블과 유사한 개념. Document & record를 가지고 있다.
하나의 record이며, field:value로 구성되어 있다. (이미지 출처: 공식문서)
uniqe value로서 document를 찾는 용도 등으로 사용되고 자동 생성된다. 관계형 데이터베이스처럼 auto-increment되는 primary key가 없어도 되는 이유!
python을 쓰다가 보니까 헷갈려서, {}가 객체=object, []가 배열=array다.
db.createUser() 관련 공식 문서 설명, 반드시 모든 key값을 가질 필요는 없다. 필요에 따라서 구성하면 됨!
// user 만들기
> db.createUser({
... user:"yeni",
... pwd:"1234",
... roles: ["readWrite", "dbAdmin"]
... });
// collection 생성
> db.createCollection('customers');
{ "ok" : 1 }
// collections 조회
> show collections
customers
// 데이터 넣기
> 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" : [ ]
})
없는 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"
}
// 조회
> 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"
}
아래의 방법을 쓰면 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" // 성별이 추가되었다.
}
아래 특정 field를 넣으면 해당 key, value를 가진 record가 지워지고, 빈 curly bracket을 넣으면 collection 전체가 지워진다.
> db.customers.remove({first_name:"John"});
WriteResult({ "nRemoved" : 1 })
지울 때 하나만 지우는 옵션
> db.customers.remove({first_name:"Steven"}, {justOne:true});
WriteResult({ "nRemoved" : 0 })
공식 문서 참고 ✔️
// 이름이 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"
}
// 나이가 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에서 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" // 성별만 추가되었다.
}
특정 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"
}
반복문을 돌릴 수 있다 😮 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
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를 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"
}
> 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값이 바뀌었다
}
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();
: 몇개야?