MongoDB에서 CRUD 구현하기

suyeonme·2021년 3월 1일
0

Node.js

목록 보기
2/3
post-thumbnail

MongoDB is a source-available cross-platform document-oriented database program. Classified as a NoSQL database program, MongoDB uses JSON-like documents with optional schemas. MongoDB is developed by MongoDB Inc. and licensed under the Server Side Public License.

SQL vs NoSQL

대표적인 SQL 데이터베이스로는, MySQL이 있다.

Setup MongoDB

Running

brew services start mongodb-community@4.4: Run
brew services stop mongodb-community@4.4 : Stop
brew services list: Verify that MongoDB is running

MongoDB Driver

사용하는 프로그래밍 언어와 MongoDB를 연결
npm i mongodb

Connecting

추가된 document는 Robo 3T를 통해서 간편하게 확인할 수 있다.

const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://127.0.0.1:27017';
const dbName = 'task-manager';

MongoClient.connect(url, { useUnifiedTopology: true }, (error, client) => {
  if (error) {
    return console.log('Unable to connect database');
  }

  const db = client.db(dbName); // Reference of database
});

CRUD

Insert documents(Create)

  • insertOne
  • insertMany
  • result.ops: Show documents
  db.collection('users').insertOne( // (*)
    {
      name: 'Suyeon',
      age: 26,
    },
    (error, result) => {
      if (error) {
        return console.log('Unable to insert documents');
      }
      console.log(result.ops); 
    }
  );

  db.collection('users').insertMany(  // (*) Take an array
    [
      {
        name: 'Suyeon',
        age: 26,
      },
      {
        name: 'Hanna',
        age: 54,
      },
    ],
    (error, result) => {
      if (error) {
        return console.log('Unable to insert documents');
      }

      console.log(result.ops);
    }
  );

ObjectId
_id(ObjectID)는 mongoDB에 의해서 자동으로 생성되는 id이다. ObjectIDtimestamp를 담고 있다. 이 때, _id는 string이 아니라 binary code이다(주의!).

  • getTimestamp()
const { ObjectID } = require('mongodb');

const id = new ObjectID();
console.log(id);
console.log(id.getTimestamp());

Querying documents (Read)

  • find: cursor(데이터가 저장되어 있는 pointer)을 반환
  • findOne: object를 반환

중복되는 값이 담긴 document가 여러개 존재할 경우, 가장 처음 documents가 반환된다.

find의 경우 cursor을 반환하기때문에, 데이터를 받아오는 것 이외에 다양한 작업을 수행할 수 있다. (toArray, count...)


// findOne
  db.collection('users').findOne(
    {
      name: 'Hanna',
    },
    (error, user) => {
      if (error) {
        return console.log('Unable to fetch');
      }
      console.log(user);
    }
  );

// find
  db.collection('users')
    .find({
      age: 26,
    })
    .toArray((error, users) => { // (*) toArray
      console.log(users);
    });

    db.collection('users')
    .find({
      age: 26,
    })
    .count((error, count) => { // (*) count
      console.log(count);
    });

_id를 사용해서 특정한 document를 가져올 때는 new ObjectID를 사용한다.(_id는 binary code이기 때문)

  db.collection('users').findOne(
    {
      _id: new ObjectID('603ccdd1fd76b0431ef6d867'),
    },
    (error, user) => {
      if (error) {
        return console.log('Unable to fetch');
      }
      console.log(user);
    }
  );

Updating documents (Update)

  • updateOne
  • updateMany

Update operators

  • $set: Sets the value of a field in a document
  • $unset: Removes the specified field from a document
  • ...

Target - Set an update operator - Update fields

// updateOne
  db.collection('users').updateOne(
    { 
      _id: new ObjectID('603ccdd1fd76b0431ef6d866'), 
    },
    { 
      $set: { 
        name: 'Jenny', 
      },
    }
  ).then(res => console.log(res)).catch(err => console.log(err));

  // updateMany
  db.collection('tasks')
    .updateMany(
      {
        completed: true,
      },
      {
        $set: {
          completed: false,
        },
      }
    )
    .then(res => console.log(res))
    .catch(err => console.log(err));

Delete documents (Delete)

  • deleteOne
  • deleteMany
  db.collection('users')
    .deleteMany({
      age: 26,
    })
    .then(res => console.log(res))
    .catch(err => console.log(err));

Robo 3T

Robo 3T is a popular desktop graphical user interface (GUI) for MongoDB hosting deployments that allows you to interact with your data through visual indicators instead of a text-based interface.

  • Database GUI Viewer

MongoDB를 실행시킨 다음, Robo 3T에서 새로운 프로젝트 생성

profile
Frontend Engineer.

0개의 댓글