[Mongoose] MongoDB를 쉽게 사용할 수 있게 하는 npm - CRUD

2020. 5. 13. 14:07컴퓨터언어/Database

728x90
반응형

*사전필수 : MongoDB를 설치해야 한다. Catalina 경험상 깔끔하고 빠른 설치는 Home Brew를 이용하자.

https://github.com/mongodb/homebrew-brew

 

mongodb/homebrew-brew

The Official MongoDB Software Homebrew Tap. Contribute to mongodb/homebrew-brew development by creating an account on GitHub.

github.com

Create

*한번 Create 또는 Insert를 한 후, node app.js를 통해 서버를 구동하면서 save()가 다시 호출되지 않도록 주석처리 유의하자.

// npm install mongoose를 하고 require한다.
const mongoose = require('mongoose');

// mongodb 서버에 guitarDB라는 이름의 Database를 기록한다.
mongoose.connect('mongodb://localhost:27017/guitarDB', {useNewUrlParser: true, useUnifiedTopology: true});

// SQL로 생각하면 "테이블"과 그 스키마를 정의하는 부분이다. 즉 필드 형태를 정의하는 것이다.
const guitarSchema = new mongoose.Schema({
  name: String,
  company: String,
  price: Number,
});

// 이제 위에서 정의한 스키마를 기반으로 하는 레코드들을 대량생산하기 위한 클래스(모델, 틀)를 정의한다.
// Guitar라는 클래스는 앞으로 생성될 수많은 다양한 guitar 문서(레코드)들이 따라야 할 규약(필드)을 담고 있으며, 그 규약 내용이 바로 위에서 정의한 스키마다.
// 즉 다음 줄은 guitarSchema를 필드로 가지는 각각의 'Guitar' Document(레코드)를 인스턴스화 하기 위한 클래스 모델을 정의하는 명령이다.
const Guitar = new mongoose.model('Guitar', guitarSchema);

// Guitar 클래스(모델)로부터 vintage62라는 Document(레코드)를 하나 생성한다.
const vintage62 = new Guitar({
  name: "Vintage 62 Stratocaster Reissue",
  company: "Fender",
  price: 2000
});

// 레코드를 한개만 INSERT 하려면 해당 레코드에 대해 아래와 같이 .save() 메서드를 이용한다.
// vintage62.save();

const es335 = new Guitar({
  name: "ES335",
  company: "Gibson",
  price: 1800
});

const angel = new Guitar({
  name: "Angel",
  company: "Tom Anderson",
  price: 4000
});

const burningWater = new Guitar({
  name: "Burning Water",
  company: "James Tyler",
  price: 5000
});

// 여러 레코드를 한번에 INSERT 하려면 클래스 모델에 대해 .insertMany()함수를 이용하여 배열로 넣는다. 이때 2번째 인자로 콜백함수를 넣어 에러를 처리하도록 하자.
// Guitar.insertMany([es335, angel, burningWater], err => {console.log(err? "Failed":"Success");})


// 또 다른 테이블이 필요하면 그 스키마와 함께 정의하면 된다. 이하 상기 동일
const customerSchema = new mongoose.Schema({
  name: String,
  age: Number
});

const Customer = new mongoose.model('Customer', customerSchema);

const paul = new Customer({
  name: "Paul",
  age: 25
});

// paul.save();

Read

* 조회를 할 때도 콜백함수로 에러를 잡아준다. 그리고 에러없이 성공적으로 조회되었다면, connection을 종료하는 습관을 들이자.

Guitar.find((err, guitars) => err ? console.log(err) : console.log(guitars))

JavaScript Object 형태로 보여준다. 이는 .(dot) 메서드를 이용하여 내부에 접근할 수 있음을 보여준다.

 

Guitar.find((err, guitars) => err ? console.log(err) : guitars.forEach(item => {
  console.log(item.name);
  mongoose.connection.close();
}))

 

Update

* updateOne()은 3개의 인자를 받는다.

1 : 어느 레코드에서 수정할 건데? -> id같이 유일한 것을 식별자로 사용하는 것이 타당하다.

2: 어떻게 수정할 건데? -> {}객체로 수정할 필드를 여러 개 지정 가능하다.

3: 에러나면 어떻게 할건데? -> 콜백함수로 로깅한다.

Guitar.updateOne({_id: "5ebb5b5aabe5f90775832740"}, {price: 8000}, (err)=> err? console.log(err):console.log("Update Complete!"))

 

Delete

Guitar.deleteOne({_id: "5ebb5b5aabe5f90775832740"}, err => err? console.log(err) : console.log("Deleted!"))

 

*deleteMany()는 조건에 맞는 레코드를 모두 지워준다.

Customer.deleteMany({name: /Paul/}, err => err ? console.log(err) : console.log("Deleted!"))
728x90
반응형