Back-End/MongoDB

[MongoDB] MQL 기초 2 - 기본 CRUD

유자맛바나나 2024. 5. 31. 01:35

 

 

Operator 공식 문서

Operators

 

Operators - MongoDB Manual v7.0

To learn which operators are unsupported in MongoDB Atlas, see Unsupported Commands in Atlas.Query and Projection OperatorsQuery operators provide ways to locate data within the database and projection operators modify how data is presented.Update Operator

www.mongodb.com

 

 

0. 기본 DB 정보 조회

  • use {database} : database 접속
  • show collections : collection 보기

 

1. Insert

1.1. insertOne()

db.employees.insertOne({
	name: "lake",
	age: 21,
	dept: "Database",
	joinDate: new ISODate("2022-10-01"),
	salary: 400000,
	bonus: null
})
  • 기본적인 Insert 쿼리
  • employees라는 컬렉션에 name, age, dept 등을 field로 갖는 document를 삽입했다
  • employees라는 컬렉션이 없으면 자동으로 생성해준다

 

쿼리 결과

 

1.2. insertMany()

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

 

쿼리 결과

insertOne() vs insertMany()

  • insertMany() 함수가 압도적으로 빠르다
  • 2건 이상일 땐 그냥 insertMany()를 사용한다고 생각하면 된다

 

2. Update

2.1. updateOne() + $set, $unset

db.employees.updateOne(
	{ name: "river" }, // query filter
	{
		$set: { // 값을 변경한다
			salary: 350000,
			dept: "Database",
			joinDate: new ISODate("2022-12-31")
		},
		$unset: { // 값을 삭제한다
			isNegotitating: ""
		}
	}
)
  • 가장 처음은 쿼리 필터의 자리다

 

쿼리 결과

 

Before

 

After

 

 

2.2. updateMany() + $exists, $mul

db.employees.updateMany(
	{ resignationDate: {$exists: false}, joinDate: {$exists: true} }, // query filter
	{ $mul: {salary: Decimal128("1.1")} }
)
  • $exists : 존재여부를 필터링
  • $mul: multiple(곱셈)의 약자
  • Decimal128 : 10진법으로 타입 지정 (1.1만 쓰면 소수점이 너무 길게 나옴)

 

쿼리 결과

 

Before

 

After

 

주의 : MongoDB는 field가 없더라도 null로 취급한다

  • 위의 After에서 lake는 bonus 필드가 있고, river는 없다.
  • 이런 상황에서 쿼리 필터에 { bonus: null } 로 작성하면 river 도 포함이 된다
  • 따라서 특정 필드의 유무를 기준으로 쿼리 필터를 사용할 땐 $exists를 사용하도록 한다!

 

3. Delete

3.1. deleteOne()

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

 

쿼리 결과

 

 

3.2. deleteMany()

db.employees.deleteMany({...});
  • 위의 … 부분을 아무것도 채우지 않으면(쿼리 필터를 작성하지 않으면) Collection에 저장된 모든 Document를 삭제한다. 단, employees라는 Collection 자체는 남아있다.

 

3.3. drop()

db.employees.drop()
  • 컬렉션을 자체를 삭제한다

 

4. Find

4.1. find()

1) 컬렉션 전체 조회

db.employees.find()
  • 컬렉션 내 모든 도큐먼트 조회

 

2) Query filter 사용

db.employees.find(
	{ name: "lake" } // query filter
)
  • 쿼리 필터를 적용해서 조회할수도 있다

 

3) operator : $lte 사용

  • $lte : Matches values that are less than or equal to a specified value.

 

db.employees.find(
	{
		age: { $lte: 25 } // age <= 21인 Document 조회
	}
)

 

4) operator : $and 사용

db.employees.find(
	{
		age: { $lte: 60 },
		dept: "Database" 
	}
)

또는 

db.employees.find(
	{
		$and: [
			{ age: { $lte: 60 } },
			{ dept: "Database" }
		]	
	}
)
  • 위와 아래는 동일하게 작동한다

 

5) operator : $or, $gt 사용

db.employees.find(
	{
		$or: [
			{ dept: "Network" }, // dept = "Network" 또는
			{ salary: { $gt: 150000 } } // salary >= 150000
		]	
	}
)
  • $gt : greater than의 약자로 크거나 같다를 필터링 할 때 사용

 

6) operator : $in 사용

db.employees.find(
	{ skills : {$in: ["java"]} } // query filter
)
  • skills라는 필드는 배열 타입이며, 해당 배열 안에 “java”가 포함된 것을 조회함

 

쿼리 결과

 

4.2. findOne()

db.employees.findOne(
	{ name: "lake" } // query filter
)