본문 바로가기

web/nodejs

Mongoose 사용법 -Node에서 mongoDB 연결 + CRUD

- MongoDB 구조 : Database > Collection > Document

 

Node에서 MongoDB를 사용하는 방법은 여러가지가 있다.

MongoDB에서 자체적으로 제공하는 Driver를 사용해도 되지만 Mongoose를 사용하는 것이 훨씬 간편하다.

Moogoose API Docs를 참고하여 작성하였다.

 

1. mongoose 모듈 가져오기, Node앱을 MongoDB에 연결하기 

const mongoose = require("mongoose");

// mongodb://[URL of  MongoDB server]/[Name of DB to connect(make one if doesn't exist)]
mongoose.connect("mongodb://localhost:27017/fruitsDB", {
  useNewUrlParser: true
});

mongoose.connect() 메소드로 실행 중인 MongoDB 서버에 Node앱을 연결한다.

메소드의 첫 번째 parameter로 mongodb://[MongoDB 서버 IP]:27017/[MongoDB DB 이름]을 입력한다.

해당하는 데이터베이스의 이름이 없을 때는 새로 데이터베이스를 만들어준다.

두 번째 parameter로 받는 객체는 local MongoDB를 이용하기 위해 추가한 것이다.

 

2. 스키마 정의

// Blue print
const fruitSchema = new mongoose.Schema({
  name: String,
  rating: Number,
  review: String
});

Document의 포맷이되는 스키마를 정의한다. Javascript에서 객체를 만들기 위한 생성자를 정의하는 것과 비슷하다.

 

※ Schema를 정의하는 부분을 다음과 같이 수정함으로 Document에 값에 대한 제약을 둘 수 있다. (Validation)

자세한 문법은 Mongoose Docs를 참조하자.

const fruitSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  rating: {
    type: Number,
    min: 1,
    max: 10
  },
  review: String
});

 

3. 스키마를 moongoose model(document 생성자)로 변환, mongoDB에 Collection 생성

// make collection Fruit => fruits
const Fruit = mongoose.model("Fruit", fruitSchema);

2번에서 정의한 스키마를 model 메소드로 model을 만들어 Fruit에 저장한다.

Fruit 상수의 첫 글자를 대문자로 정의하는 것은 이 함수가 생성자가 되기 때문이다.

동시에 mongoDB에는 collection을 생성한다. model 메소드 첫 번째 parameter로 String을 입력하는데, 이 것을 mongoDB에서 자동으로 복수형으로 변형시켜 collection을 만든다.

즉, "Fruits"는 "fruit"로 변환되어 collection의 이름이 된다. ("Person"을 입력하면 "people"로 변형시켜줄 정도로 잘 변형시켜준다.)

 

4. Model로 Document 데이터 생성

const apple = new Fruit({
  name: "Apple",
  rating: 7,
  review: "Juicy and sweet"
});

const kiwi = new Fruit({
  name: "kiwi",
  rating: 5,
  review: "Too sour for me"
});

const banana = new Fruit({
  name: "banana",
  rating: 6,
  review: "Tasty but Easy to decay"
});

model은 document로 저장할 데이터를 만드는 생성자이다.

만들어진 model로 document들을 만들었다.

 

5. Document를 MongoDB에 저장하기 (CREATE)

// save object to fruitDB, fruits collection
banana.save();

//Way to save many data to DB in once.
Fruit.insertMany([apple, kiwi, banana], function(err) {
  if (err) {
    console.log(err);
  } else{
    mongoose.connection.close();
    console.log("Successfully saved to fruitDB");
  }
});

첫 번째 방법처럼 save 메소드로 바로 DB에 저장할 수 있다.

insertMany 메소드로 여러 개의 객체를 한 번에 저장할 수도 있다.

 

6. MongoDB에 저장된 Document 내용 읽기 (READ)

Fruit.find(function(err, fruits) {
  if (err) {
    console.log(err);
  } else {
    mongoose.connection.close();
    fruits.forEach(function(element) {
      console.log(element.name);
    });
  }
});

fruits collection 안에 있는 모든 내용을 읽어와 fruits 변수에 저장한다.

특정 데이터만 읽어오려면 parameter로 condition에 해당하는 JSON 객체를 넘겨주면 된다.

Array 형태로 리턴되기 때문에 forEach 메소드로 각 객체에 접근할 수 있다.

 

7. MongoDB에 저장된 Document 내용 수정하기 (UPDATE)

Fruit.updateOne({
  _id: "5e859d8cef3a5d234c6c19c0"
}, {
  name: "Peach"
}, function(err) {
  if (err) {
    console.log(err);
  } else {
    console.log("Successfully updated the document");
  }
});

첫 번째 parameter로 fruits collection 안에 있는 Document 중 수정할 Document를 선택한다.

두 번째 parameter로 수정할 내용을 입력한다.

기존 key에 대한 value를 수정할 수도 있고, 새로운 key, value를 입력할 수도 있다.

 

8. MongoDB에 저장된 Document 삭제하기 (DELETE)

Fruit.deleteOne({
  _id: "5e86a7a216b28f3b08a88755"
}, function(err) {
  if (err) {
    console.log(err);
  } else{
    console.log("Successfully deleted");
  }
});

첫 번째 parameter로 삭제할 Document를 선택하여 삭제한다.

 

 

Collection의 CRUD에 대한 메소드로 단수형, 복수형 등 여러가지가 있다.

필요한 용도에 따라 Docs를 참고해서 사용하자.

 

 

코드 전문

const mongoose = require("mongoose");

// mongodb://[URL of  MongoDB server]/[Name of DB to connect(make one if doesn't exist)]
mongoose.connect("mongodb://localhost:27017/fruitsDB", {
  useNewUrlParser: true
});

// Blue print
const fruitSchema = new mongoose.Schema({
  name: String,
  rating: Number, 
  review: String
});

// make collection Fruit => fruits
const Fruit = mongoose.model("Fruit", fruitSchema);

const apple = new Fruit({
  name: "Apple",
  rating: 7,
  review: "Juicy and sweet"
});

const kiwi = new Fruit({
  name: "kiwi",
  rating: 5,
  review: "Too sour for me"
});

const banana = new Fruit({
  name: "banana",
  rating: 6,
  review: "Tasty but Easy to decay"
});

// CREATE. save object to fruitDB, fruits collection
apple.save();

// Way to save many data to DB in once.
Fruit.insertMany([apple, kiwi, banana], function(err) {
  if (err) {
    console.log(err);
  } else{
    mongoose.connection.close();
    console.log("Successfully saved to fruitDB");
  }
});

// READ. find or select. result returns to 'fruits'
Fruit.find(function(err, fruits) {
  if (err) {
    console.log(err);
  } else {
    mongoose.connection.close();
    fruits.forEach(function(element) {
      console.log(element.name);
    });
  }
});

// UPDATE
Fruit.updateOne({
  _id: "5e859d8cef3a5d234c6c19c0"
}, {
  name: "Peach"
}, function(err) {
  if (err) {
    console.log(err);
  } else {
    console.log("Successfully updated the document");
  }
});

// DELETE
Fruit.deleteOne({
  _id: "5e86a7a216b28f3b08a88755"
}, function(err) {
  if (err) {
    console.log(err);
  } else{
    console.log("Successfully deleted");
  }
});

 

'web > nodejs' 카테고리의 다른 글

Express 프로젝트 Boilerplate  (0) 2020.04.08
Express를 이용한 MongoDB RESTful API 서버 만들기  (0) 2020.04.06
.gitignore for Node  (0) 2020.04.01