mongodb
여기에 포스트 내용을 작성하세요.
몽고디비의 특징 중 하나는 자바스크립트 문법을 사용한다는 것입니다. 노드도 자바스크립트를 사용하므로 데이터베이스마저 몽고디비를사용한다면 자바스크립트만 사용하여 웹애플리케이션을 만들 수 있는 것입니다. 하나의 언어만 사용하면 되므로 생산성도 매우 높습니다. 하지만 몽고 디비는 흔히 사용하는 RDBMS가 아니라 특색이 뚜렷한 NoSQL이므로 특징을 잘 알고 사용해야합니다,
mysql은 sql을 사용하는 대표적인 데이터베이스이며, sql을 사용하지 안흔ㄴ nosql이라고 부르는 데이터베이스도 있습니다. sql과 Nosql은 차이점이 여러 개 있는데 그중에서 대표적인 차이점 몇 가지만 알아보겠습니다.
sql(mysql) | nosql(mongodb) |
---|---|
규칙에 맞는 데이터입력 | 자유로운 데이터 입력 |
테이블간 join 지원 | 컬렌션간 join 미지원 |
트랜잭션 지원 | 트랜잭션 미지원 (v8 부터 지원) |
안정성,일관성 | 확장성,가용성 |
용어(테이블,로우,컬럼) | 용어(컬렉션,다큐먼트,필드) |
좋습니다. 요청하신 대로 책 사진에 나온 내용을 있는 그대로 옮겨드리겠습니다. (불필요한 각색 없이 직역합니다.)
먼저 NoSQL에는 고정된 테이블이 없습니다. 테이블에 상응하는 컬렉션이라는 개념이 있지만, 컬럼을 따로 정의하지는 않습니다. 예를 들어 MySQL은 users 테이블을 만들 때 name, age, married 등의 컬럼과 자료형, 옵션 등을 정의하지만, 몽고디비는 그냥 users 컬렉션을 만들고 끝입니다. users 컬렉션에는 어떠한 데이터라도 다 들어갈 수 있습니다. users 컬렉션 안(MySQL의 로우에 해당하는 개념)에는 name, age, married, comment, createdAt, updatedAt 등의 데이터가 들어갈 수 있습니다.
몽고디비에는 MySQL과 달리 JOIN 기능이 없습니다. JOIN을 통해 뭔가를 엮을 수 있지만, 하나의 쿼리로 여러 테이블을 합치는 작업이 항상 가능하지는 않습니다.
트랜잭션을 지원하지 않는 것도 몽고디비의 특징 중 하나입니다. 트랜잭션이란 여러 쿼리가 모두 정상적으로 수행되거나 아예 하나도 수행되지 않음을 보장하는 기능입니다. 트랜잭션이 없으면 예를 들어 A라는 계좌 로우에 금액을 추가해야 하고 B라는 계좌 테이블에서 계좌 로우를 통해 ATM 기계에서 돈을 출금해야 하는 상황이 생겼을 때, 출금을 수행하는 중에 서버가 꺼지거나 장애가 발생하면 돈이 중간에 사라지거나 없던 돈이 생기는 문제가 발생합니다. 트랜잭션은 한 일이 발생하지 않도록 보장하는 기능입니다. 트랜잭션이 없으면 데이터를 믿을 수 있지만, MySQL 같은 수준의 트랜잭션성은 없습니다. 따라서 데이터 일관성에 문제가 생길 수 있습니다.
Note ▶ 몽고디비의 트랜잭션 현재 대중적으로 사용되는 몽고디비의 버전은 3입니다. 몽고디비는 4 버전부터 트랜잭션을 지원한다고 발표했습니다. 트랜잭션이 지원되면 데이터의 일관성을 유지하는 데 큰 도움이 될 것입니다.
트랜잭션도 안 되고, JOIN도 안 되지만 몽고디비를 사용하는 이유는 확장성과 가용성 때문입니다. 데이터의 일관성을 보장해주는 기능이 약한 대신 데이터를 빠르게 불러올 수 있고, 쉽게 여러 서버로 데이터를 분산할 수 있습니다.
용어도 조금 다릅니다. MySQL의 테이블, 로우, 컬럼을 몽고디비에서는 각각 컬렉션, 다큐먼트, 필드라고 부릅니다.
애플리케이션을 만들 때 꼭 한 가지 데이터베이스만 사용하는 것은 아닙니다. 많은 기업이 SQL과 NoSQL을 동시에 사용하고 있습니다. SQL과 NoSQL은 각각 특징이 다르므로 필요에 맞게 사용합니다. 예를 들어 항공사 예약 시스템의 경우 비행기 표에 관한 정보가 모든 항공사에 일관성 있게 전달되어야 하므로 예약 처리 부분의 데이터베이스는 MySQL을 사용합니다. 대신 핵심 기능 외의 빅데이터, 메신징, 세션 관리 등에는 확장성과 가용성을 위해 몽고디비를 사용할 수도 있습니다.
MongoDB Docker 이미지 가져오기 docker pull mongodb/mongodb-community-server:latest
2 이미지를 컨테이너로 실행 docker run –name mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latest
명령의 -p 27017:27017가 컨테이너 포트를 호스트 포트에 매핑합니다. 이렇게 하면 localhost:27017 연결 문자열을 사용하여 MongoDB에 연결할 수 있습니다.
특정 버전의 MongoDB를 설치하려면 Docker 실행 명령에서 : 뒷부분에 버전을 지정합니다. Docker는 지정된 버전을 가져와 실행합니다.
예를 들어 MongoDB 5.0을 실행하려면 다음을 실행합니다.
docker run –name mongodb -p 27017:27017 -d mongodb/mongodb-community-server:5.0-ubuntu2004
사용 가능한 버전의 전체 목록은 태그에서 확인 가능합니다.
mongosh을(를) 사용하여 MongoDB 배포서버에 연결합니다. mongosh –port 27017
5 배포서버 유효성 검사 MongoDB 인스턴스가 실행 중인지 확인하려면 Hello 명령을 실행합니다.
db.runCommand( { hello: 1 } )
이 명령의 결과는 mongod 배포서버를 설명하는 문서를 반환합니다.
{ isWritablePrimary: true, topologyVersion: { processId: ObjectId(“63c00e27195285e827d48908”), counter: Long(“0”) }, maxBsonObjectSize: 16777216, maxMessageSizeBytes: 48000000, maxWriteBatchSize: 100000, localTime: ISODate(“2023-01-12T16:51:10.132Z”), logicalSessionTimeoutMinutes: 30, connectionId: 18, minWireVersion: 0, maxWireVersion: 20, readOnly: false, ok: 1 }
show dbs
use
db.createUser({ user: ‘이름’, pwd:’1234’, roles:[‘root’]})ㄱ db.getUsers()
좋습니다, 바로 짚어드릴게요.
당신이 입력한 코드:
db.users.find({ age: {$ge: 30}, married: true }, { _id:0, name:1, age:1 })
오류 이유:
- MongoDB에는
$ge
라는 연산자는 없습니다. $gte
(greater than or equal
= 크거나 같다)로 써야 합니다.
정상 코드 수정
db.users.find({ age: { $gte: 30 }, married: true }, { _id: 0, name: 1, age: 1 })
$gte
→ Greater Than or Equal (>=)$gt
→ Greater Than (>)$lte
→ Less Than or Equal (<=)$lt
→ Less Than (<)
요약
잘못 쓴 것 | 고쳐야 할 것 | 뜻 |
---|---|---|
$ge | $gte | greater than or equal (크거나 같다) |
추가 Tip: 만약 결혼 여부 married: true
조건을 빼고 나이만 필터하고 싶으면:
db.users.find({ age: { $gte: 30 } }, { _id: 0, name: 1, age: 1 })
update
db.users.update({ name: ‘lee’}, {$set: {comment: ‘안녕하세요 이필드를 바꿔보겠습니다’}}) DeprecationWarning: Collection.update() is deprecated. Use updateOne, updateMany, or bulkWrite. { acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 } nodejs>
delete
db.users.remove deprecated
nodejs> db.users.delete db.users.deleteMany db.users.deleteOne
nodejs> db.users.deleteOne({name:’lee’}) { acknowledged: true, deletedCount: 1 }
mongoose
몽구스는 시엘라이즈와 달리 ODM(object Paument Mtpping 이라고 불립니다.) 몽고디비는 릴레이션이 아니라 다큐먼트를 사용하므로 ORM이 아니라 ODM입니다. 몽고디비 자체가 이미 자바스크립트인데도 굳이 자바스크립트 객체와 매핑하는 이유가 궁금한 지 입니다. 그 이유는 몽고디비에 없어서 불편한 기능들을 몽구스가 보완해주기 때문입니다. 먼저 스키마라는 것이 생겼습니다. 몽고디비는 테이블이 없어서 자유롭게 데이터를 넣을 수 있지 만, 때로는 자유로움이 불편함을 초래합니다. 실수로 잘못된 자료형의 데이터를 넣을 수도 있고 다른 다큐먼트에는 없는 필드의 데이터를 넣을 수도 있습니다. 몽구스는 몽고디비에 데이터를 볼 기 전 노드 서버 단에서 데이터를 한 번 필터링하는 역할을 해줍니다. 또한, MySOL에 있는 JOIN 기능을 populate라는 메서드로 어느 정도 보완해줍니다. 따라서 환 계가 있는 데이터를 쉽게 가져올 수 있습니다. 비록 쿼리 한 번에 데이터를 합쳐서 가져오는 것은 아니지만, 이 작업을 우리가 직접 하지 않아도 되므로 편리합니다. ES2015 프로미스 문법과 강력하고 가독성이 높은 쿼리 빌더를 지원하는 것도 장점입니다.
Express-generator로 learn-mongoose 프로젝트를 만듭니다. 콘솔 $ express learn-mongoose -view=pug create : learn-mongoose create : learn-mongoose /package. json create : learn-mongoose /app.js create : learn-mongoose/views create : learn-mongoose/views/index.pug create : learn-mongoose/views/layout.pug