Bon Voyage

MongoDB Node.js 드라이버, 간단하게 시작해보기 본문

개념정리/데이터베이스

MongoDB Node.js 드라이버, 간단하게 시작해보기

nangkyeong 2019. 7. 17. 21:52

https://mongodb.github.io/node-mongodb-native/3.2/quick-start/quick-start/
Quick Start 부분을 번역함. + 추가 예시 

해당 포스트에서는 운영체제가 Windows 10 이었다.
**
++ Mac 버전도 추가해두었다.**


1. 작업할 디렉토리에 Package.json 만들기

cd c:\작업할\디렉토리\경로
npm init
npm install mongodb --save

npm install mongodb --save 를 실행한 후에는 npm이 이것저것 다운로드 하는 것을 확인할 수 있어야 한다.
install이 끝나면, 해당 디렉토리 아래에 node_modules 디렉토리가 생기고, 그 안에 패키지들이 다운로드 된 것을 볼 수 있다.

+맥 버전 추가! npm init 을 하면 해당 패키지에 package.json파일을 만들기 위한 설정을 시작한다.
특별한 경우가 아니라면 다 기본값으로 enter 로 넘길 수 있다.

$ npm init
package name: (해당 디렉토리 이름으로 기본값) 
version: (1.0.0) 
description: 
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /Users/Nang/Desktop/UDG_before/package.json:

{
  "name": "해당 디렉토리 이름",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

npm으로 mongodb를 설치할 때 설치 되는 내용도 확인.

$ npm install mongodb --save
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN udg_before@1.0.0 No description
npm WARN udg_before@1.0.0 No repository field.

+ mongodb@3.3.0-beta2
added 6 packages from 4 contributors and audited 6 packages in 2.639s
found 0 vulnerabilities

2. MongoDB Server 시작하기

mongoDB가 설치한다. 내 환경에 현재 mongoDB가 설치되어 있으므로 넘어감.
(참고: 다운로드는 여기서 할 수 있다.)

3. MongoDB에 연결하기

기본 포트인 27017로 접속하여, myproject 라는 이름의 DB에 접속해보자.

//test.js

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert'); 
//assert는 Node.js 내부에서 테스트를 해보기 위한 모듈이다.

// 연결할 url
const url = 'mongodb://localhost:27017';

// DB 이름
const dbName = 'myproject';

// MongoClient를 생성
const client = new MongoClient(url);

// 서버에 연결하기 위한 connect 메소드
client.connect(function(err) {
  assert.equal(null, err); //equal은 err가 null일 때 넘겨준다
  console.log("Connected successfully to server");
  const db = client.db(dbName);
  client.close(); 
});

실행은 터미널에서 node 명령어와 js파일 경로를 주면 된다

node 파일/경로/test.js

참고

Assert 모듈은 예상한 결과와 실제 결과를 비교하는 단순한 테스트를 수행하기 위해 사용된다. 실제 결과가 예상한 결과와 맞지 않으면 Exception이 throw된다. Assert는 테스팅 프레임워크가 아니라서 Node.js의 내부적인 개발 목적으로만 사용되고, Exception 시 실행이 정지된다.

예를 들어 아래의 코드는 err가 not null일 경우 Exception을 throw한다.

assert.equal(null, err);

node.js의 assert api를 참고하려면 여기 :https://nodejs.org/api/assert.html
참고 URL : https://stackoverflow.com/questions/28129223/node-js-assert-module-in-mongodb-driver-documentation

4. CRUD를 해보자!

(0) Function 호출하기

선언된 함수를 호출하려면 아래와 같은 코드를 connect body 안에 넣으면된다.

client.connect(function(err) {
    ...
    functionToCall(매개인자, function() {
        client.close();
    });
    ...
});

client.connect에 callback function을 추가하는 방법은 아래와 같다
(각 function의 내용은 아래를 참고하자!)

insertDocuments(db, function() {
    updateDocument(db, function() {
        removeDocument(db, function() {
            client.close();
        });
    });
});

(1) Insert

const insertDocuments = function(db, callback) {
  // 넣을 컬렉션 가져오기
  const collection = db.collection('documents');
  // 시험삼아 몇 개 넣어보자
  collection.insertMany([
    {a : 1}, {a : 2}, {a : 3}
  ], function(err, result) {
    assert.equal(err, null);
    assert.equal(3, result.result.n); 
        //3개를 insert했으므로 실제 결과가 3이 아니면 Exception
    assert.equal(3, result.ops.length);
    console.log("Inserted 3 documents into the collection");
    callback(result);
  });
}

//하나의 문서만 넣고싶다면 insertOne 사용
collection.insertOne({a :1 }, function(err,result){
    assert.equal(err,null);
    assert.equal(1, result.result.n);
    console.log("Inserted 1 documents into the collection");
});

Insert method는 object를 리턴하는데, 그 안에는 다음과 같은 필드가 포함된다.

  • result는 MongoDB의 결과 documents
  • ops는 _id 필드와 함께 insert된 documents
  • connection insert 수행할 때 사용된 연결

(2) Find

//해당 컬렉션의 모든 Document 찾기
const findDocuments = function(db, callback) {
  // 컬렉션 선택
  const collection = db.collection('documents');
  // 모든 Document를 Find 해보자
  collection.find({}).toArray(function(err, docs) {
    assert.equal(err, null);
    console.log("Found the following records");
    console.log(docs)
    callback(docs);
  });
}

//filtering하여 찾기 
const findDocuments2 = function(db, callback) {
  // 컬렉션 선택
  const collection = db.collection('documents');
  // a가 3인 Document를 Find 해보자
  collection.find({'a': 3}).toArray(function(err, docs) {
    assert.equal(err, null);
    console.log("Found the following records");
    console.log(docs);
    callback(docs);
  });
}

find method는 쿼리에 해당하는 모든 document를 리턴한다.

(3) Update

const updateDocument = function(db, callback) {
  // 컬렉션 선택
  const collection = db.collection('documents');
  // a가 2인 document에서 b를 1로 업데이트
  collection.updateOne({ a : 2 } 
    , { $set: { b : 1 } }, function(err, result) {
    assert.equal(err, null);
    assert.equal(1, result.result.n);
    console.log("Updated the document with the field a equal to 2");
    callback(result);
  });
}

//sub document를 insert하고 싶다면 $push 연산자를 사용하면 된다.
collection.updateOne({ a : 2}
	,{ $push : { b : { b_1 : 3 , b_2 : 4} } } ), function(err, result){
    //원하는 코드 작성
});

update는 수정된 문서중 가장 첫번째 document를 리턴한다.

(4) Remove

const removeDocument = function(db, callback) {
  // 컬렉션 선택
  const collection = db.collection('documents');
  // a가 3인 document 하나를 삭제하자
  collection.deleteOne({ a : 3 }, function(err, result) {
    assert.equal(err, null);
    assert.equal(1, result.result.n);
    console.log("Removed the document with the field a equal to 3");
    callback(result);
  });    
}

5. Index 생성하기

인덱스는 어플리케이션의 성능을 향상시킨다.

//documents 컬렉션의 a 필드에 인덱스를 생성하자
const indexCollection = function(db, callback) {
  db.collection('documents').createIndex(
    { "a": 1 },
      null,
      function(err, results) {
        console.log(results);
        callback();
    }
  );
};
Comments