MongoDB CRUD

기운찬곰·2020년 9월 19일
0

MongoDB

목록 보기
2/4
post-thumbnail
post-custom-banner

MongoDB 관리 GUI 툴

MySQL을 보면 MySQL Workbench가 있듯이 MongoDB에는 Compass라는 도구가 존재한다. 혹은 Robo 3T라는 것도 있다.

MongoDB Compass

MongoDB가 실행중이라는 가정하에 MongoDB Compass를 통해 연결해보도록 하겠다.

설정은 간단하다. Host는 localhost일테고, MongoDB의 포트는 기본적으로 27017로 실행되고 있다.

접속이 잘되었다면 위에 처럼 나오게 된다. 나는 예전에 생성했던 blog라는 database안에 users, posts라는 collection이 있고 그 안에 documents를 가지고 있는것이 보인다. UI가 깔끔하게 정리되어있어서 쓸만하다.

Robo 3T

다음은 Robo 3T 프로그램을 소개하겠다.

마찬가지로 MongoDB랑 connect 해주면 된다. 그런다음 오른쪽 마우스 클릭후 Open shell을 클릭해보자.

Robo 3T의 장점은 Shell을 사용할 수 있다는 것입니다. Compass에서는 Shell이 도통 어디있는지 보이지가 않더라고...🤔

Compass와 비교해서 조금 떨어지는 UI이지만 보여줄거는 다 보여주고 있어서 나름 쓸만하다고 생각한다.


Node JS와 MongoDB 연동하기

프로젝트를 하나만듭니다. $ npm init -y를 한다음에 package.json을 만듭니다.

그런 다음 $ npm install mongodb를 실행시켜서 mongodb를 다운받는다. mongodb는 MongoDB Driver이다. mongo 콘솔 클라이언트 명령과 동일하게 조작할 수 있다는 특징이 있다.

insertOne / insertMany

코드를 다음과 같이 작성하였다. 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

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);
  });

그 외에도 비교연산자, 논리연산자, 정규식을 통해 찾기 등 기능이 정말 많다...ㄷㄷ 여기서 하나하나 설명하기는 좀 어려울거 같고 필요할때마다 찾아쓰도록 하자.

find

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);
});

updateOne / updateMany

이번에는 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는 매칭되는 모든 다큐먼트를 수정한다는 차이가 있다. 실습은 따로 하지 않겠다.

deleteOne / deleteMany

마지막으로 삭제하는 법이다. 이 역시 간단하다.

db.collection("users").deleteOne({
  age: 28,
});

age가 28로 매칭 되는 다큐먼트들 중에서 첫번째만 제거해준다. deleteMany를 쓰면 매칭되는 다큐먼트 전부를 제거하겠지?


마침

이상으로 기본적인 MongoDB CRUD 사용법에 대해 공부해봤습니다. 생각보다 종류하고, 옵션하고 다양해서 여기서 못다룬 부분도 꽤 많습니다.

여기에 없는 내용은 아래 References를 확인바란다.

References

Hits

profile
배움을 좋아합니다. 새로운 것을 좋아합니다.
post-custom-banner

0개의 댓글