DB/MongoDB

MongoDB Query Language

Code Maestro 2023. 8. 9. 22:02
728x90

1. SQL VS MQL

 

SQL(Structured Query Language)은 구조화된 질의어로 보통 DB에서 사용한다.

 

 

반면 MongoDB는 MQL(MongoDB Query Language)를 사용하고, SQL과의 차이점은 함수형 인자를 사용한다.

 

참고로 몽고 shell 자바스크립트 기반으로 됐다. 그래서 자바 스크립트 명령어가 가능하다.

 

아래는 SQL과 MQL의 차이 예시다.

 

SQL 
SELECT * FROM people
MQL
db.people.find()

 

 

SQL
SELECT id, user_id, status FROM people
MQL
db.people.find(
	{},
    {user_id:1,status:1}
 )

 

SQL
SELECT user_id, status FROM people
MQL 
db.people.find(
	{},
    {user_id:1,status:1,_id:0}
 )

 

 

SQL
SELECT user_id, status FROM people WHERE status = 'A'
db.people.find(
	{status:"A"},
    {user_id:1,status:1,_id:0}
 )

 

이외에도 더 많은 차이 예시를 알고 싶으면 공식 문서를 확인하면 된다. 

 

 

2. Query Filter & Operator

1) 삽입

출처: 몽고 DB 공식문서

field에 맞는 value 값을 넣을 수 있다.

2) 수정

db.users.updateMany(
	{age:{$lt: 18} },
    {$set:{status:"reject"}}
)

update Filter에 조건을 입력하고, $set을 통해 update action을 할 수 있다.

 

3) 삭제

db.users.deleteMany(
	{status: "reject"}
)

delete filter의 조건을 통해 해당 컬렉션을 삭제할 수 있다.

 

4) 읽기

출처: 몽고 DB 공식문서

projection은 조회할 field이고, query criteria로 조건을 걸어서 원하는 부분을 Read 할 수 있다.

 

 

위의 예시에서 나오는 $lt, $gt 같은 것들이 operator이다. 각종 연산을 수행하기 위해 몽고 DB에서 제공해주는 도구이다. query filter와 함께 사용해서 다양한 조건을 걸 수 있다. 

 

operator는 너무 많기에 외울 필요는 없고, 공식 문서  참고하면 된다.

 

3. 기본 CRUD

실습에 앞서서 실습 환경은 MongoDB atlas의 MongoDB shell이다.

 

 

atlas는 기본적으로 sample data를 제공해주기에 sample 데이터를 활용해보겠다.

 

DB들을 보면 목록들이 위와 같이 나온다.

 

실습에서는 test db를 사용하겠다.

 

1) Document 생성

먼저 document를 생성해보자.

 

db.employees.insertOne({
	name:"lake",
    age:21,
    dept:"database",
    joinDate: new ISODate("2022-10-01"),
    salary:400000,
    bonus: null})

위의 document를 생성하고

 

db.employees.find()

조회해보면

 

삽입한 도큐먼트를 확인할 수 있다.

 

2) 다중 삽입

db.employees.insertMany([
	{
    	name:"ocean",
        age:45,
        dept:"Network",
        joinDate: new ISODate("1999-11-15"),
        salary: 100000,
        regignationDate: new ISODate("2002-12-23"),
        bonus:null
    },
    {
    	name:"river",
        age:34,
        dept:"Devops",
        isNegotiating: true
    }
 ])

insertMany로 여러 개의 Document를 삽입할 수 있다.

 

조회해보면

 

3개가 들어있음을 확인할 수 있다. 

 

3) 대량의 다큐먼트 삽입

위에서 설명했듯이 MongoShell은 자바스크립트 기반으로 됐다. 그래서 자바 스크립트 명령어가 가능하다.

 

for(i=0;i<300;i++){
	db.insertTest.insertOne({a:i})
}

 

300개를 넣는다고 가정해보면 insertOne으로 삽입하면 시간이 좀 걸린다.

 

var docs= [];
for(i=0;i<300;i++){
	docs.push({a:i})
}
db.insertTest.insertMany(docs);

반면 이건 insertOne과 달리 바로 수행이 된다. 그러므로 대량으로 데이터를 넣을 때는 insertMany 사용해야 한다.

 

4) 다큐먼트 수정

db.employees.updateOne(
    {name: "river"},
    {
        $set:{
            salary: 350000,
            dept: "Database",
            joinDate: new ISODate("2022-12-31")
        },
        $unset:{
            isNegotiating: ""
        }
    }
)

첫번째 인자에는 쿼리 필터가 들어간다. $set은 수정할 데이터를 의미하고, $unset는 필드를 제거하겠다는 의미이다.

 

수행을 하면 하나의 도큐먼트가 변경됐음을 확인할 수 있다.

 

조회를 해보면

내용이 변경됐음을 확인할 수 있다.

 

5) 다수의 다큐먼트 수정

다수의 DB 연봉을 10% 인상한다고 가정해보자.

 

db.employees.updateMany(
    { resignationDate: { $exists: false }, joinDate:{ $exists: true } },
    { $mul: {salary: Decimal128("1.1")} }
)

updateMany로 수정이 가능하다. $exists 존재하는지 여부를 확인하고, $mul 전체적으로 곱하는 것을 의미한다. 곱하면 소수점 자리가 있기에 Decimal128 타입으로 지정해준다.

 

수정을 하면 2개의 다큐먼트가 변경됐음을 확인할 수 있다.

 

joinDate가 존재하고, resignationDate가 없는 사원의 도큐먼트만 수정됐음을 확인할 수 있다.

 

6) 다큐먼트 삭제

db.employees.deleteOne({name: "river"})

이름이 river인 다큐먼트를 삭제해보자.

 

조회를 해보면

삭제된 걸 확인할 수 있다.

 

7) 전체 다큐먼트 삭제

만약 전체를 삭제하고 싶다면

db.employees.deleteMany({});

실행해보면

 

전체가 삭제된 확인할 있다.

 

그러나 collection 삭제가 되지 않는다.

 

만약  collection 삭제하고 싶다면

Drop 사용하면 된다.

 

 

8) 조회

먼저 atlas의 DB 중에서 sample_guides를 사용해보자.

 

 

조회를 하면 행성들의 데이터를 볼 수 있다.

 

db.planets.findOne({name:"Mars"})

 

이렇게 특정 이름만 검색할 있다.

 

9) and 조회

db.planets.find({
	hasRings:true,
    orderFromSun: {$lte:6}
    })

,를 이용하면 기본적으로 and 조건이다.

 

조건에 맞는 document 들을 있다.

 

10) or 조회

db.planets.find({
	$or:[
    	{hasRings:{$ne: false}},
        {orderFromSun:{$gt:6}}
    ]
})

 

이렇게 or 조건문으로 조회할 있다.

 

11) in 조회

in으로 배열 안의 특정 값을 조회할 수 있다.

 

db.planets.find(
	{ mainAtmosphere: {$in: ['02']}}
)

 

번째 인자에는 queryFilter 들어간다. mainAtmosphere에 '02'가 들어간 document들을 모조리 조회할 수 있다.

 

 

 

※ 기본적으로 Opertator 사용하려면 $ 표시를 써야 한다.

728x90