Framework/Express
5.express MongoDB 라이브러리로 MongoDB 사용하기
oniri1
2024. 9. 12. 03:57
몽고 DB는 noSQL이기 때문에, MySQL을 다루는 sequelize보다 훨씬 사용이 간단하다.
몽고 DB를 다루는 라이브러리는 대표적으로 몽고시와 몽고디비가 있는데 이번엔 MongoDB를 사용해봤다.
다운로드
npm i mongodb
사용
import { MongoClient } from "mongodb";
// 몽고 DB 서버 URL
const url = 'mongodb://localhost:27017';
// 데이터베이스 이름
const dbName = 'mydatabase';
// async를 위해 함수 작성
async function 아무이름() {
try {
const client = new MongoClient(url);
// 몽고 DB에 연결
await client.connect();
// 데이터베이스 선택
const db = client.db(dbName);
// 컬렉션 선택 (없으면 자동 생성됨)
const collection = db.collection('mycollection');
// 추가할 문서
const document = { name: 'John', age: 30, city: 'New York' };
// 문서 추가
const result = await collection.insertOne(document);
console.log('Document inserted:', result);
} catch (err) {
console.error('Error:', err);
} finally {
// 연결 닫기
client.close();
}
}
// 함수 호출
addDocument();
간단하지 않는가?
mongodb 라이브러리랑 실제 mongoDB 쿼리문은 똑같아서 sequelize처럼 belongsTo 이런거 쓴다고 헷갈릴 이유도 없다..
대충 서버랑 몽고랑 연결만 시키고 싶으면 아래처럼 함수를 작성만해도 된다.
import { MongoClient } from "mongodb";
export let client;
const connectToMongoDB = async (mongoUrl) => {
try {
client = new MongoClient(mongoUrl);
await client.connect(); // 몽고DB 서버에 연결
console.log("Connected Mongo");
} catch (error) {
throw error
}
};
이후 server.js
await connectToMongoDB(process.env.MONGOURL);
mongoDB CURD(create update read delete)
- insertOne(document): 컬렉션에 단일 문서를 생성
db.mycollection.insertOne({ "name": "oniri1", "age": 25 })
- insertMany(documents): 컬렉션에 여러 문서를 생성
db.mycollection.insertMany([{ "name": "oniri1", "age": 30 }, { "name": "oniri1", "age": 35 }])
- find(query, projection): 컬렉션에서 문서를 검색
query
: 문서를 필터링하기 위한 쿼리 조건, 아래에서 설명projection
: 선택적으로 반환할 필드를 제어, 아래에서 설명- 예:
db.mycollection.find({ "age": { $gt: 25 } }, { "_id": 0, "name": 1 })
- 아무런 조건을 쓰지 않으면 전부 가져온다 예:
db.mycollection.find()
- findOne(query, projection): 컬렉션에서 첫 번째 문서를 검색
- 예:
db.mycollection.findOne({ "name": "oniri1" })
- 예:
- updateOne(filter, update): 컬렉션에서 첫 번째 문서를 업데이트
filter
: 업데이트할 문서를 선택하기 위한 쿼리 조건update
: 새로운 값 또는 수정할 내용입니다.- 예:
db.mycollection.updateOne({ "name": "oniri1" }, { $set: { "age": 26 } })
- updateMany(filter, update): 컬렉션에서 여러 문서를 업데이트
- 예:
db.mycollection.updateMany({ "age": { $lt: 30 } }, { $set: { "status": "active" } })
- 예:
- deleteOne(filter): 컬렉션에서 첫 번째 문서를 삭제
- 예:
db.mycollection.deleteOne({ "name": "oniri1" })
- 예:
- deleteMany(filter): 컬렉션에서 여러 문서를 삭제
- 예:
db.mycollection.deleteMany({ "status": "inactive" })
- 예:
mongoDB query
몽고 쿼리문이다.
전부 외울 필요는 없고, 지금은 이해를 한 후에 사용할 때 찾아쓰는게 편하다.
예시 : db.mycollection.find({$and:[{"name":"oniri1"},{"age":30}]})
- Equality(동등) 연산자: 지정된 값과 필드의 값을 비교
{ field: value }
: 필드 값이 주어진 값과 동일한 문서를 찾습니다.
- Comparison(비교) 연산자: 필드 값을 다른 값과 비교
{ field: { $gt: value } }
: 필드 값이 주어진 값보다 큰 문서를 찾습니다.{ field: { $lt: value } }
: 필드 값이 주어진 값보다 작은 문서를 찾습니다.{ field: { $gte: value } }
: 필드 값이 주어진 값보다 크거나 같은 문서를 찾습니다.{ field: { $lte: value } }
: 필드 값이 주어진 값보다 작거나 같은 문서를 찾습니다.{ field: { $eq: value } }
: 필드 값이 주어진 값과 같은 문서를 찾습니다.
- Logical(논리) 연산자: 여러 개의 조건을 조합
{ $and: [ { condition1 }, { condition2 } ] }
: 모든 조건을 만족하는 문서를 찾습니다.{ $or: [ { condition1 }, { condition2 } ] }
: 적어도 하나의 조건을 만족하는 문서를 찾습니다.{ $not: { condition } }
: 주어진 조건을 만족하지 않는 문서를 찾습니다.- 예:
db.mycollection.find({$and:[{"name":"John"},{"age":30}]})
- Element(요소) 연산자: 필드의 존재나 값의 유형을 확인
{ field: { $exists: true } }
: 지정된 필드가 존재하는 문서를 찾습니다.
- Array(배열) 연산자: 배열 필드에 대한 조건을 지정
{ field: { $elemMatch: { condition } } }
: 배열 필드에서 조건을 충족하는 요소를 포함하는 문서를 찾습니다.
- 정규 표현식 연산자: 필드 값에 대한 정규 표현식을 사용하여 검색
{ field: /pattern/ }
: 필드 값이 주어진 정규 표현식 패턴과 일치하는 문서를 찾습니다.
MongoDB projection
몽고에서 projection은 "데이터명": 0 또는 1로 사용한다.
1은 포함하며 0은 포함하지 않는다는 명령을 수행한다.
0의 경우
db.mycollection.find({}, { "age": 0 })
age에 해당하는 데이터를 제외하고 전부 불러온다
결과
{
_id: ObjectId('6640ea0fa5d4066e288b49e1'),
name: 'oniri1',
city: 'hamster'
}
-----
1의 경우
db.mycollection.find({}, { "age": 1 })
age에 해당하는 데이터만을 전부 불러온다
{ _id: ObjectId('6640e1cea5d4066e288b49de'), age: 30 },
{ _id: ObjectId('6640e94ba5d4066e288b49df'), age: 30 },
{ _id: ObjectId('6640ea0fa5d4066e288b49e1'), age: 1240 }
0과 1은 같이 사용할 수 없다.
chatLog> db.mycollection.find({ "age": { $gt: 25 } },{"age":1,"name":0})
이렇게 사용하게 된다면 오류가 난다. 왜냐면 1과 0은 서로 다른 명령어기 때문이다.
1은 전체에서 이것만 포함
0은 전체에서 이것만 제거
예시로 age,name,city가 있을 때, 1과 0을 같이 사용하면(age) (age, city)로 출력이 되서 age가 겹치기 때문에 오류가 난다.
다만 포함 포함인 1과1, 0과0은 같이 사용할 수 있다.
db.mycollection.find({ "age": { $gt: 25 } },{"age":1,"name":1})
age와 name의 값 만을 가져온다.
db.mycollection.find({ "age": { $gt: 25 } },{"age":0,"name":0})
age와 name을 제외한 값 만을 가져온다.