반응형

웹에서 가볍게 사용해보려고 이용한 MongoDB

nosql의 대표주자이며 json을 데이터베이스로 취급할수있어서 사용해보았다

 

맨땅에 헤딩하듯 기초 명령어를 찾아가며 적용해본거라

굉장히 단순하게 이용해봄

 

 

Express 모듈을 사용하여 Node.js와 MongoDB를 연동하는 법과

DB에 컬렉션 추가하는법, 저장된 DB를 조회하는법과 컬렉션을 제거하는법을 기록해본다

 

 

 

※ mongoDB 버전 확인하는법

 

커맨드 창에 아래의 명령어 입력

 

mongod --version

 

아래 예시는 몽고디비 v5.0.2를 기준으로 작성되었다

버전별로 명령어가 조금 다를수있어서 본인의 버전을 숙지하는게 좋다

 

 

 

Node.js MongoDB 연결

var fs = require('fs');
var express = require('express')
var app = express()

//인덱스 페이지
app.get('/', function(request, response) { 	
	fs.readFile('index.html', function (error, data) {
		response.writeHead(200, { 'Content-Type': 'text/html' });
		response.end(data);
		console.log('메인페이지');
    });	
});

//===== 데이터베이스 연결 =====//

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

//데이터베이스 객체를 위한 변수 선언
var database;

//데이터베이스에 연결
function connectDB() {
	
	var databaseUrl = 'mongodb://localhost:27017/DB';
	
	MongoClient.connect(databaseUrl, function(err, db) {
		if (err) throw err;
		
		console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
		
		// database 변수에 할당
		database = db;
		
		//database.collection is not a function 오류나서 추가해봄
		database = db.db('DB');

	});
}


app.listen(80, function() {
  console.log('Example app listening on port 80!')
  connectDB();
});

 

처음 디비 연동할 때, connectDB함수에서 database.collection is not a function이라는 오류를 맞닥뜨려서

추가한 내용 :  database = db.db('DB');

 

몽고디비 버전마다 디비 연결 시 방법 차이가 있는것같은데 일단 나는 저방식으로 해결이 됐다

다른 방식은 나에게 적용되지않았음

 

여기까지가 서버실행 시, 몽고디비 연동하는 법

 

 

아래에는 연동후 데이터를 저장하고 조회, 삭제하는법을 기록해본다

 

 

 

Node.js MongoDB에 데이터베이스 컬렉션 추가 (일회성)

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  database = db.db("gansik");
  database.createCollection("gansik", function(err, res) {
    if (err) throw err;
    console.log("Collection created!");
    db.close();
  });
});

처음은 이렇게 컬렉션을 만들어주고

그다음부터 컬렉션에 데이터를 넣어야 조회가 되는 과정인듯하다

 

같은 이름의 컬렉션을 반복해서 추가할 경우, 에러가 발생하니 한번 생성한 컬렉션 이름은 잘 숙지하고

컬렉션을 추가할경우, 겹치지 않게 지정하자

 

 

 

Node.js MongoDB 컬렉션에 데이터 추가 (1개 일 때)

//DB에 등록
app.post('/register',function(request, response){	

	var body = request.body;
	
	console.log('saveDB 호출');
	saveDB(body.gansik);
	
	response.end();
});

//데이터베이스 등록
function saveDB(body){
	var databaseUrl = 'mongodb://localhost:27017/DB';
	MongoClient.connect(databaseUrl, function(err, db) {
	if (err) throw err;

	database = db.db("gansik");

	database.collection("gansik").insertOne(body, function(err, res) {
			if (err) throw err;
			console.log("등록이 완료되었습니다.");
			db.close();
		});
	});	
}

아직 1개씩만 저장하는 단계라 insertOne을 사용함

2개 이상의 데이터를 한번에 저장할 경우, insertMany 메서드를 사용한다

 

 

2개이상 저장 예시는 아래 사이트 참고

 

 

 

Node.js MongoDB 컬렉션에 저장된 DB 조회하기

//DB에서 가져오기
app.post('/find',function(request, response){		
	var body = request.body;
	
	console.log('findDB 호출');
	
	findDB();
});


function findDB(){	
	var url = "mongodb://localhost:27017/DB";

	MongoClient.connect(url, function(err, db) {
		if (err) throw err;
		  
		database = db.db("gansik");
		
		//모든 db 조회 가능
		database.collection("gansik").find({}).toArray(function(err, result) {
			if (err) throw err;
			console.log('DB에서 가져온 결과 : ');
			console.log(result);
			db.close();
		});
	});
	
}

콜백으로 받은 result를 출력해보면 여태까지 DB에 저장된 모든값들이 find().pretty() 양식으로 출력된다

 

 

 

Node.js 특정 키의 값만 출력하고 싶은 경우

MongoClient.connect(url, function(err, db) {
		if (err) throw err;
		  
		database = db.db("gansik");		
     
		//특정 db 조회 가능 - 이 예시는 _id랑 price값 출력 - find.pretty 양식으로 출력안되고 그냥 출력됨
		database.collection("gansik").find({}, { projection: { price:1} }).toArray(function(err, result) {
			if (err) throw err;
			console.log('DB에서 가져온 결과 : lat long menu');
			// console.log(' : '+result.lat_ +', '+result.long_+', '+result.menu);
			console.log(result);
			response.send(JSON.stringify(result));
			
			db.close();
            });
	});

price 키에 해당하는 값과 디폴트로 정해진 _id의 값만이 출력됨

만약 price에 0 값을 주거나 아예 입력을 하지 않는다면 price의 값은 출력이 되지않는다

 

따라서 특정 필드를 unique로 정해준 상태가 아니어서

_id가 디폴트로 정해진 경우{projection:{ _id: 0} } 을 입력한다면 _id 값은 출력되지 않음

 

특정 필드에 해당하는 값만 출력하고 싶을 때 사용하면 유용하겠다

 

 

 

Node.js 특정 키의 값만 출력하는 법 적용 예제

MongoClient.connect(url, function(err, db) {
		if (err) throw err;
		  
		database = db.db("gansik");		
     
		//0이면 그 필드값은 안보이고 필드 값이 1일경우의 값만 보임
		// _id 제외, name, menu, loc, price 출력 가능 - find.pretty 양식으로 출력됨
		database.collection("gansik").find({}, { projection: { _id:0, name:1, menu:1, loc:1, price:1} }).toArray(function(err, result) {
			if (err) throw err;
			console.log(result);
			response.send(JSON.stringify(result));
			
			db.close();
		});
	});

_id는 출력되지 않으며 저장된 디비에서 모든 name, menu, loc, price의 값들만 출력이 가능하다

 

 

 

 

 

Node.js MongoDB 특정 값을 가진 데이터 조회하기

MongoClient.connect(url, function(err, db) {
		if (err) throw err;
		  
		database = db.db("gansik");
		
		var findDB_ = menu;

		//쿼리 = 필터 사용해서 특정 값 조회 price가 2000원인 값의 모든 필드 조회 가능
		var query = { menu: findDB_ };
		
		database.collection("gansik").find(query).toArray(function(err, result) {
			if (err) throw err;

			console.log(result);
			response.send(JSON.stringify(result));
			
			db.close();
		});
	});

query에는 위에 적힌것처럼 저장된 DB에서

menu라는 키(key) 중에서 findDB_의 값을 가진 메뉴를 찾도록 한다

 

문자열을 검색해도 되고 나의 경우는 클라이언트가 요청한 정보를 검색하는걸 해보고싶어서

파라미터로 전달받은 변수 findDB_를 사용했다

 

 

 

Node.js DB에 있는 컬렉션 제거하기

	var databaseUrl = 'mongodb://localhost:27017/gansikDB';
	
	console.log('drop the db');
	
	MongoClient.connect(databaseUrl, function(err, db) {
		if (err) throw err;
		database = db.db("gansik");
		database.collection("gansik").drop(function(err, delOK) {
			if (err) throw err;
			if (delOK) console.log("Collection deleted");
			db.close();
		});
	});

 

 

 

이미 적용해본 코드와 추가해본 코드가 있어서

오타가 있을수있으니 혹시라도 에러가 발생한다면 알려주세요

 

 

 

참고 :

https://www.w3schools.com/nodejs/nodejs_mongodb_create_db.asp

 

Node.js MongoDB Create Database

Node.js MongoDB Create Database Creating a Database To create a database in MongoDB, start by creating a MongoClient object, then specify a connection URL with the correct ip address and the name of the database you want to create. MongoDB will create the

www.w3schools.com

 

 

 

반응형

+ Recent posts