MongoDB Shell을 사용하여 CRUD의 기본을 알아본다.
MongoDB Shell은 JavaScript 실행 환경을 가지고 있어 JavaScript의 실행이 가능하다.
> for(var i = 0; i < 3 ; i++) { print("i = " + i); }
i=0
i=1
i=2
1. Create
use <database_name>
shell method를 사용하여 database를 생성한다.
만약 동일한 이름의 Database가 존재할 경우, 그 database를 사용하며 존재하지 않을 경우, database를 생성한다.
> use mongo-example
switched to db mongo-example
db
shell method를 사용하여 현재 사용중인 database를 확인한다.
> db
mongo-example
show dbs
shell method를 사용하여 데이터베이스 리스트를 확인한다.
> show dbs
local 0.000GB
이 시점에서 mongo-example database는 아직 생성되지 않았다. 최소 한 개 이상의 document를 추가하여야 database가 생성된다.
insert()
메소드를 사용하여 collection에 document를 insert한다. 이때 collection books도 생성된다.
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
Parameter | Type | Description |
---|---|---|
document | document or array | collection에 insert할 document 또는 document의 array이다. |
writeConcern | document | Option. database에 write(insert, update, remove) 처리를 영속화시키기 위한 설정이다. 기본 설정을 사용하려면 이 설정을 생략한다. 자세한 내용은 Write Concern을 참조하기 바란다. |
ordered | boolean | Option(Defaults: true). true로 설정하면 document array의 인덱스 순으로 insert한다. 처리중 에러가 발생하면 에러가 발생된 document 이후의 처리는 진행되지 않는다. |
> db.books.insert({ title: "Example1", author: "Lee", price: 100 })
WriteResult({ "nInserted" : 1 })
한번에 여러 개의 document를 insert할 수 있다.
> db.books.insert([
{ title: "Example2", author: "Lee", price: 200 },
{ title: "Example3", author: "Lee", price: 300 },
{ title: "Example4", author: "Lee", price: 400 }
])
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
MongoDB는 Schema-less하므로 동일한 Collection 내에 있더라도 document level의 다른 Schema를 가질 수 있다.
> db.books.insert({ title: "Example5", author: "Lee", price: 200, stock: 0 })
WriteResult({ "nInserted" : 1 })
database list를 확인하면 mongo-example database가 생성된 것을 확인할 수 있다.
> show dbs
local 0.000GB
mongo-example 0.000GB
collection list를 확인하려면 아래 shell method를 실행한다.
> show collections
books
또는 getCollectionNames() 메소드를 사용한다.
> db.getCollectionNames()
[ "books" ]
2. Read
find()
메소드를 사용하여 collection 내의 document를 select한다.
db.collection.find(query, projection)
Parameter | Type | Description |
---|---|---|
query | document | Option. document selection criteria(기준)이다. criteria 없이 collect 내의 모든 document를 select하는 경우에는 생략하거나 { }를 전달한다. SQL의 WHERE절과 유사하다. |
projection | document | Option. document select 결과에 포함될 field이다. |
다음 예제는 books collection 내의 모든 document를 select한다.
> db.books.find()
{ "_id" : ObjectId("57bd5f2e414be2f9e2b81770"), "title" : "Example1", "author" : "Lee", "price" : 100 }
{ "_id" : ObjectId("57bd5f34414be2f9e2b81771"), "title" : "Example2", "author" : "Lee", "price" : 200 }
{ "_id" : ObjectId("57bd5f34414be2f9e2b81772"), "title" : "Example3", "author" : "Lee", "price" : 300 }
{ "_id" : ObjectId("57bd5f34414be2f9e2b81773"), "title" : "Example4", "author" : "Lee", "price" : 400 }
{ "_id" : ObjectId("57bd5f3b414be2f9e2b81774"), "title" : "Example5", "author" : "Lee", "price" : 200, "stock" : 0 }
pretty()
를 사용하면 return data를 format에 맞게 출력한다.
> db.books.find().pretty()
{
"_id" : ObjectId("57bd5f2e414be2f9e2b81770"),
"title" : "Example1",
"author" : "Lee",
"price" : 100
}
{
"_id" : ObjectId("57bd5f34414be2f9e2b81771"),
"title" : "Example2",
"author" : "Lee",
"price" : 200
}
{
"_id" : ObjectId("57bd5f34414be2f9e2b81772"),
"title" : "Example3",
"author" : "Lee",
"price" : 300
}
{
"_id" : ObjectId("57bd5f34414be2f9e2b81773"),
"title" : "Example4",
"author" : "Lee",
"price" : 400
}
{
"_id" : ObjectId("57bd5f3b414be2f9e2b81774"),
"title" : "Example5",
"author" : "Lee",
"price" : 200,
"stock" : 0
}
별도 지정하지 않은 _id field가 추가되었다. 모든 document는 unique한 _id field를 갖는다.
select할 field를 지정할 수 있다. _id는 지정하지 않아도 출력에 포함되므로 select할 field에 포함시키지 않을 경우에는 projection의 해당 field의 value에 0을 지정하여 명시적으로 배제하여야 한다.
> db.books.find({ }, { _id: 0, title: 1 })
{ "title" : "MongoDB Example" }
{ "title" : "Example1" }
{ "title" : "Example2" }
{ "title" : "Example3" }
SQL SELECT 구문과 find() 구문을 비교하면 다음과 같다.
SELECT id, title, author
FROM books
db.users.find(
{ },
{ title: 1, author: 1 }
)
SELECT title, author
FROM books
db.users.find(
{ },
{ _id: 0, title: 1, author: 1 }
)
SELECT title, author
FROM books
WHERE price = 200
db.books.find(
{ price: 200 },
{ title: 1, author: 1, _id: 0 }
)
projection를 생략하면 모든 field가 선택된다. 다음은 price가 100 보다 크고(100 미포함) 400보다 작은(400 포함) document를 select한다.
SELECT *
FROM books
WHERE price > 100
AND price <= 400
db.books.find(
{ price: { $gt: 100, $lte: 400 } }
)
$gt
는 greater than을 의미하는 MongoDB Query operator이다.
Query operator(쿼리 연산자)에는 비교(Comparison), 논리(Logical), 요소(Element), 평가(Evaluation), 배열(Array) 등이 있다.
그 중 사용 빈도가 높은 연산자에 대해 알아본다.
비교(Comparison) 연산자
Operator | Meaning | Description |
---|---|---|
$eq | equals | 지정 값과 일치하는 값 |
$gt | greater than | 지정 값보다 큰 값 |
$gte | greater than or equals | 지정 값보다 크거나 같은 값 |
$lt | less than | 지정 값보다 작은 값 |
$lte | less than or equals | 지정 값보다 작거나 같은 값 |
$ne | not equal | 지정 값과 일치하지 않는 값 |
$in | in an array | 지정 배열 안에 속하는 값 |
$nin | none in an array | 지정 배열 안에 속하지 않는 값 |
다음은 price가 200보다 크고 400보다 작거나 같은 document를 select한다.
db.books.find(
{ price: { $gt: 200, $lte: 400 } }
)
논리 연산자
Operator | Description |
---|---|
$or | 지정 조건중 하나라도 true이면 true |
$and | 모든 지정 조건이 true이면 true |
$not | 지정 조건이 false이면 true, true이면 false |
$nor | 모든 지정 조건이 false이면 true |
다음은 price가 200보다 작거나 stock이 0인 document를 select한다.
db.books.find(
{ $or: [ { price: { $lt: 200 } }, { stock: 0 } ] }
)
정규표현식을 사용할 수 있다. 다음은 title이 /Example[1-2]/에 일치하는 document를 select한다.
db.books.find(
{ title : /Example[1-2]/ }
)
3. Update
update()
메소드를 사용하여 collection 내의 document를 update한다.
db.<collection_name>.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
Parameter | Type | Description |
---|---|---|
query | document | update를 위한 selection criteria(기준)이다. find()의 query와 같다. SQL의 WHERE절과 유사하다. |
update | document | document에 update할 수정 사항이다. |
upsert | boolean | Option(Default: false) true로 설정하면 query criteria에 매칭하는 document가 없을 경우 새로운 document를 insert한다. false로 설정하면 insert하지 않는다. |
multi | boolean | Option(Default: false) true로 설정하면 query criteria에 매칭하는 document 모두를 update한다. false로 설정하면 하나의 document만 update한다. |
writeConcern | document | Option. database에 write(insert, update, remove) 처리를 영속화시키기 위한 설정이다. 기본 설정을 사용하려면 이 설정을 생략한다. 자세한 내용은 Write Concern을 참조하기 바란다. |
UPDATE books
SET author = "Kim"
WHERE price > 200
db.books.update(
{ price: { $gt: 200 } },
{ $set: { author: "Kim" } },
{ multi: true }
)
$set
는 SQL의 SET을 의미하는 MongoDB Update field operator이다.
Operator | Description |
---|---|
$inc | field의 value를 지정한 수만큼 증가시킨다. |
$rename | field 이름을 rename한다. |
$setOnInsert | update()의 upsert가 true로 설정되었을 경우, document가 insert될 때의 field value를 설정한다. |
$set | update할 field의 value를 설정한다. |
$unset | document에서 설정된 field를 삭제한다 |
$min | 설정값이 field value보다 작은 경우만 update한다. |
$max | 설정값이 field value보다 큰 경우만 update한다. |
$currentDate | 현재 시간을 설정한다 |
다음은 author가 “Kim”인 document의 price field value를 -50 증가시킨다(즉 50 감소시킨다). 이때 multi를 생략하였으므로 query criteria에 매칭되는 document 중 첫번째만 update된다.
db.books.update(
{ author: "Kim" },
{ $inc: { price: -50 } }
)
다음은 모든 document의 field name을 “ttle”에서 “title”로 rename한다. 새로운 collection test에 테스트용 document를 insert한다.
db.test.insert([
{ ttle: "Example1", author: "Lee", price: 200 },
{ ttle: "Example2", author: "Lee", price: 300 },
{ ttle: "Example3", author: "Lee", price: 400 }
])
db.test.update(
{},
{ $rename: { "ttle": "title" } },
{ multi: true }
)
다음은 author가 “Park”인 document의 title을 “Example4”로 update한다. 이때 query criteria({ author: “Park” })에 매칭되는 document가 없으면 upsert: true에 의해 새로운 document가 insert된다.
$set value에는 { title: “Example4” }만 설정되어 있으나 query criteria { author: “Park” }과 $setOnInsert value { price: 100 }도 더불어 insert된다.
db.test.update(
{ author: "Park" },
{
$set: { title: "Example4" },
$setOnInsert: { price: 100 } // set default value
},
{ upsert: true }
)
위 처리의 결과 아래의 document가 insert된다.
{
"_id" : ObjectId("57b841d16a73151e5d98f3c9"),
"author" : "Park",
"title" : "Example4",
"price" : 100
}
다음은 test collection의 첫번째 document의 author, price field를 삭제한다.
db.test.update(
{ },
{ $unset: { author: "", price: 0 } }
)
다음은 dateEntered field value와 $min의 value로 설정한 dateEntered field value(설정값)를 비교하여 설정값이 field value보다 작은 경우 설정값으로 field value를 update한다.
db.test.drop()
db.test.insert([
{ "title": "Example1", price: 100, dateEntered: new Date(Date.now()) },
{ "title": "Example2", price: 200, dateEntered: new Date(Date.now()) }
])
db.test.update(
{ },
{ $min: { dateEntered: new Date("2016-07-01") } }
)
상기 처리의 결과로 document는 아래와 같이 update된다.
// update 전
{
"_id" : ObjectId("57b85d77370997928bbee569"),
"title" : "Example1",
"price" : 100,
"dateEntered" : ISODate("2016-08-20T13:39:03.880Z")
}
{
"_id" : ObjectId("57b85d77370997928bbee56a"),
"title" : "Example2",
"price" : 200,
"dateEntered" : ISODate("2016-08-20T13:39:03.880Z")
}
// update 후
{
"_id" : ObjectId("57b85d77370997928bbee569"),
"title" : "Example1",
"price" : 100,
"dateEntered" : ISODate("2016-07-01T00:00:00Z")
}
{
"_id" : ObjectId("57b85d77370997928bbee56a"),
"title" : "Example2",
"price" : 200,
"dateEntered" : ISODate("2016-08-20T13:39:03.880Z")
}
4. Delete
Document의 삭제
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
Parameter | Type | Description |
---|---|---|
query | document | deletion criteria(기준)이다. collection 내의 모든 document를 삭제할 경우, {}를 전달한다. |
justOne | boolean | Option(Default: false) true로 설정하면 하나의 document만 삭제한다. 생략하면 deletion criteria에 매칭하는 document 모두를 삭제한다. |
writeConcern | document | Option. database에 write(insert, update, remove) 처리를 영속화시키기 위한 설정이다. 기본 설정을 사용하려면 이 설정을 생략한다. 자세한 내용은 Write Concern을 참조하기 바란다. |
다음은 price가 200보다 큰 모든 document를 삭제한다.
db.books.remove(
{ price: { $gt: 200 } }
)
다음은 books collection의 모든 document를 삭제한다.
db.books.remove( { } )
Collection의 삭제
db.books.drop()
Database의 삭제
use mongodb_example
db.dropDatabase();