본문 바로가기
SQL

2) MongoDB 사용법... 이어서

by Downy_J 2023. 9. 19.
728x90
반응형
SMALL

https://www.mongodb.com/docs/manual/core/document/

 

Documents — MongoDB Manual

Docs Home → MongoDB Manual MongoDB stores data records as BSON documents. BSON is a binary representation of JSON documents, though it contains more data types than JSON. For the BSON spec, see bsonspec.org. See also BSON Types.MongoDB stores records as

www.mongodb.com

스키마 정의

모델의 컬럼값 정의라 보면 된다

 

비슷하지만 다른방식이라 몽고디비만의

그런걸 좀 알아야 활용범위가 좀 커질듯 하다

먼저 mongooes 모듈에서 Schema 생성자를 써 스키마를 만드는데 저렇게 따로 서도 되지만
const userSchema = new mongoose.Schema({ }); 해도 됨

id 값은 _id 라고 자동생성을 해주기때문에 따로 쓸필요없다

mongooes 스키마는 String, Number, Date, Buffer, Boolean, Mixed, ObjectId, Decimal128, BigInt, Arraym, DocumentArray, Mixed, SchemaType 등을 값으로 갖는다

마지막 몽구스의 model 메서드로 스키마와 몽고디비 컬렉션을 연결하는 모델을 생성
ObjectId 가 있는데 옵션으로 ref 속성을 주고 값으론 User를 줬음

이 말은 commenter 필드에 User 스키마의 사용자 ObjectId 가 들어간다는 말임

JOIN 기능임

컬렉션 명을 바꿀수도 있음
module.exports = mongoose.model("User", userSchema);

여기서 User라 쓰면 몽구스는 users 하고 소문자복수형으로 만들어 컬렉션을 생성함
그런데 이런 강제로 명칭 바꿔버리는게 싫으면 세번째 인수로

module.exports = mongoose.model("User", userSchema, userTable);
이래 넣어주면 내가 원하는대로 지정이 된

required :  필드가 필수 입력인지 여부를 지정
validation rules : 데이터의 유효성을 검사하는 규칙을 지정
default value : 데이터가 저장될 때 기본값을 지정 (minLength:3, maxLength:100)
relation : 다른 데이터와의 관계를 지정해 하나의 데이터가 다른 데이터에 연결되는걸 말함 (ref: 'user')

 

기본 데이터 형식
String:
문자열은 ASCII 또는 유니코드 문자열을 저장
Number:
숫자는 정수 또는 실수를 저장
Boolean:
불리언은 true 또는 false를 저장
Date:
날짜는 날짜와 시간을 저장
ObjectId:
ObjectId는 MongoDB의 고유한 식별자
Buffer:
Buffer는 바이너리 데이터를 저장
Decimal128:
Decimal128은 128자리 소수점 정수를 저장
BigInt:
BigInt은 64비트 정수를 저장


배열 데이터 형식
Array:
Array는 다양한 타입의 데이터를 포함할 수 있는 배열을 저장
DocumentArray:
DocumentArray는 Mongoose 문서를 포함하는 배열을 저장


기타 데이터 형식
Mixed:
Mixed는 모든 타입을 허용하는 타입
SchemaType:
SchemaType은 사용자 정의 타입을 저장


라우트 연결

(controller 없이 그냥 박아 넣음..)

route/index.js
User.find({ });로 모든 유저를 찾아
mongoose.html 랜더링 할때 { users }를 변수로 넣음

몽고디비도 Promis를 지원하므로
async/await이나 try/catch 문을 써서 성공/실패 정보 얻으면 됨
route/user.js
GET /user 일때는 사용자 정보 조회할때
POST /user 일때는 사용자 등록할때  씀

JSON으로 반환하고 집어넣고 한다

모든 사용자 찾아 users에 담고
const users = await User.find({});

JSON 으로 사용자들 담어
res.json(users);


name, age, married 값을 담고 create로 저장
const user = await User.create({
name: req.body.name,
age: req.body.age,
married: req.body.married,
});
사용자 댓글쓴거 조회하는 라우터

여기서 볼건 저 find({}) 메서드 안의 옵션이다
댓글쓴 사용자 아이디로 댓글을 조회 하고
populate 메서드로 관련있는 컬렉션에서 다큐먼트를 불러오는거

Commente 스키마에 ref속성에 User 를 쓴 이유가 여기서 보여지는데, 알아서 users 컬렉션에서 사용자 다큐먼트를 찾아 합친다

commenter 필드가 이제 사용자 다큐먼트로 치환되고
commenter 필드는 ObjectId가 아니라 저걸 가진 사용자 다큐먼트가 되는것 
route/commenters.js
댓글 CRUD 기능을 수행하는 라우터

먼저 POST /comments
Comment.create({ })로 댓글 저장

Comment.populate 로 프로미스의 결과로 반횐된  comment 객체에
다른 컬렉션 다큐먼트 불러와서 path로 "어떤필드"를 합칠건지 설정
PATCH /comments/:id
댓글 수정 라우터
수정을 할거니깐 update메서드를 쓸거고
첫번째 인수로 어떤 다큐먼트(req.params.id)를 수정할건지 나타내는 쿼리를 넣고
두번째 인수로 수정할 필드(comment)랑 값 들어있는 객체(req.body.comment)를 제공

여기 까지 보면 시퀄라이즈랑를 생각하면
인수의 순서가 반대다

몽고디비와는 달리 $set연산자 없이도 기입한 필드만 바꿈

실수로 다큐먼트를 통째 수정할일 없어 안전



DELETE /comments/:id
댓글을 삭제하는 라우터다

deleteOne메서드 써서 삭제한

서버 실행해 보자

728x90