MySQL을 보면 MySQL Workbench가 있듯이 MongoDB에는 Compass라는 도구가 존재한다. 혹은 Robo 3T라는 것도 있다.
MongoDB가 실행중이라는 가정하에 MongoDB Compass를 통해 연결해보도록 하겠다.
설정은 간단하다. Host는 localhost일테고, MongoDB의 포트는 기본적으로 27017로 실행되고 있다.
접속이 잘되었다면 위에 처럼 나오게 된다. 나는 예전에 생성했던 blog라는 database안에 users, posts라는 collection이 있고 그 안에 documents를 가지고 있는것이 보인다. UI가 깔끔하게 정리되어있어서 쓸만하다.
다음은 Robo 3T 프로그램을 소개하겠다.
마찬가지로 MongoDB랑 connect 해주면 된다. 그런다음 오른쪽 마우스 클릭후 Open shell을 클릭해보자.
Robo 3T의 장점은 Shell을 사용할 수 있다는 것입니다. Compass에서는 Shell이 도통 어디있는지 보이지가 않더라고...🤔
Compass와 비교해서 조금 떨어지는 UI이지만 보여줄거는 다 보여주고 있어서 나름 쓸만하다고 생각한다.
프로젝트를 하나만듭니다. $ npm init -y
를 한다음에 package.json을 만듭니다.
그런 다음 $ npm install mongodb
를 실행시켜서 mongodb를 다운받는다. mongodb는 MongoDB Driver이다. mongo 콘솔 클라이언트 명령과 동일하게 조작할 수 있다는 특징이 있다.
코드를 다음과 같이 작성하였다. mongodb와 연결하고 insert를 통해 데이터를 추가해주는 코드이다.
const mongodb = require("mongodb");
const MongoClient = mongodb.MongoClient;
const connectionURL = "mongodb://127.0.0.1:27017";
const databaseName = "task-manager";
MongoClient.connect(connectionURL, { useNewUrlParser: true }, (err, client) => {
if (err) {
return console.log("Unable to connect to database.");
}
console.log("Connected correctly.");
// db가 없으면 생성. 있으면 조회
const db = client.db(databaseName);
// 해당 db에 collection가 없으면 생성(있으면 조회) 후 document 하나 저장
db.collection("users").insertOne({
name: "gildong",
age: 27,
});
});
오호. 생성이 된 것을 확인할 수 있다. 추가적으로, 어떤 함수를 어떤 식으로 작성해야하는지는 공식문서를 보면 알 수 있으니 참고 바란다.
insertOne
과 다르게 여러개를 동시에 저장하기 위해서는 insertMany
를 써야한다.
db.collection("users").insertMany(
[
{
name: "Jon",
age: 28,
},
{
name: "Smith",
age: 23,
},
],
(err, result) => {
if (err) {
return console.log("Unable to insert user");
}
// 실행된 결과 반환
console.log(result.ops);
}
);
findOne
은 조건에 맞는 documents중에 가장 첫번째만 리턴해서 보여준다.
db.collection("users").findOne({ name: "Jon" }, (err, user) => {
if (err) {
return console.log("Unable to insert user");
}
// 실행된 결과 반환
console.log(user);
});
여기서는 name이 Jon인 docuement만 리턴해서 보여주고 있습니다. { }
안에는 값이 없어도 되며, 여러값을 입력해도 된다. ex) { name: "Jon", age: 28 }
_id
를 검색하려면 ObjectID를 이용해야한다. (아.. 진행해보다 보니 findById
를 이용하면 될듯하다)
const { MongoClient, ObjectID } = require("mongodb");
(생략)
db.collection("users").findOne({ _id: new ObjectID("5c111...") }, (err, user) => {
if (err) {
return console.log("Unable to insert user");
}
// 실행된 결과 반환
console.log(user);
});
그 외에도 비교연산자, 논리연산자, 정규식을 통해 찾기 등 기능이 정말 많다...ㄷㄷ 여기서 하나하나 설명하기는 좀 어려울거 같고 필요할때마다 찾아쓰도록 하자.
findeOne
이 최초 만족하는 한개만 반환한다면 find
는 조건이 만족하는 여러개를 반환할 수 있는 함수이다.
db.collection("users")
.find({ age: 27 })
.toArray((err, users) => {
console.log(users);
});
find
뒤에는 sort(), limit(), skip(), count()
등에 함수를 이어서 쓸 수도 있다.
db.collection("users")
.find({ age: 27 })
.count((err, count) => {
console.log(count);
});
이번에는 update하는 방법이다.
db.collection("users").updateOne(
{
_id: new ObjectID("5f64fcb54bd2b8489c070d73"),
},
{
$set: {
// $set : 해당 필드만 수정
name: "Mike",
},
}
);
잘 바뀐것을 알 수 있다. $set
말고도 여러가지 오퍼레이션이 있다. 그 중에서 $inc
는 다음과 같이 쓸 수 있다.
db.collection("users").updateOne(
{
_id: new ObjectID("5f64fcb54bd2b8489c070d73"),
},
{
$inc: {
// $inc : 현재 age + 1
age: 1,
},
}
);
$inc
를 쓰면 현재 age에서 1증가된 값을 저장할 수 있다. -1을 쓰면 1감소된 값이 저장되겠지?
updateOne
은 매칭되는 다큐먼트 중 첫번째만 수정할 수 있고, updateMany
는 매칭되는 모든 다큐먼트를 수정한다는 차이가 있다. 실습은 따로 하지 않겠다.
마지막으로 삭제하는 법이다. 이 역시 간단하다.
db.collection("users").deleteOne({
age: 28,
});
age가 28로 매칭 되는 다큐먼트들 중에서 첫번째만 제거해준다. deleteMany
를 쓰면 매칭되는 다큐먼트 전부를 제거하겠지?
이상으로 기본적인 MongoDB CRUD 사용법에 대해 공부해봤습니다. 생각보다 종류하고, 옵션하고 다양해서 여기서 못다룬 부분도 꽤 많습니다.
여기에 없는 내용은 아래 References를 확인바란다.