MongoDB에서 CRUD를 실행하는 법에 대해 알아보자.
이전 포스트에서 이어진다.
쿼리를 실행하여 컬렉션에서 문서를 검색하는 메소드이다.
db.people.find({});
컬렉션을 삭제하는 메소드이다.
db.people.drop();
문서를 컬렉션에 삽입하는 메소드이다.
db.people.insert({name:'호랑이1', 'age':10, 'salary':1000});
db.people.drop();
db.people.insert({name:'호랑이1', 'age':10, 'salary':1000});
db.people.insert({name:'호랑이2', 'age':20, 'salary':2000});
db.people.insert({name:'호랑이3', 'age':30, 'salary':3000});
db.people.find({});
find() 메소드는 일반적으로 db.collection.find(query, projection)
의 형태로 사용된다.
projection은 반환할 필드를 선택하는 옵션이다. 기본적으로는 모든 필드를 반환하며, 필요한 필드만 선택하여 조회 결과를 제한할 수 있다.
{_id:false}
를 조건으로 걸면 아이디를 출력하지 않는다.
db.people.find({}, {_id:false});
Table View로 결과를 확인하면 다음과 같다.
db.people.find({'name':'호랑이2'});
db.people.find({},{'age':false});
age를 제외한 값들이 출력된다.
호랑이 1의 age 출력하기
db.people.find({'name':'호랑이1'}, {'age':true});
id를 제외하고 원하는 field 출력하기
db.people.find({'name':'호랑이1'}, {_id: false, 'age':true, 'salary': true});
위 코드를 아래와 같이 false를 0, true를 1로로 나타낼 수 있다.
db.people.find({'name':'호랑이1'}, {_id:0, 'age':2, 'salary':2});
그러나 age: 0과 같이 _id
를 제외한 field에는 false 값을 설정할 수 없다.
따라서, 출력을 원하는 field만 입력하면 된다.
우선 데이터를 초기화하자.
db.people.drop();
db.people.insert({name:'호랑이1', 'age':10, 'salary':1000});
db.people.insert({name:'호랑이2', 'age':20, 'salary':2000});
db.people.insert({name:'호랑이2', 'age':30, 'salary':3000});
db.people.insert({name:'호랑이4', 'age':10, 'salary':3000});
{$함수이름:인수}
형태로 함수를 호출 할 수 있다.
예시를 살펴보자.
{$set:{}}
: set 함수 호출, 전달하는 인수의 type이 document
{$set:{age:40}}
: set 함수 호출, 전달하는 인수의 type이 document, document의 데이터 age = 40으로 설정
{$함수:인수, $함수:인수, ...}
의 형태도 사용할 수 있다.
변수 = 함수();
변수 = $abs $cmp
와 같이 사용 가능하다.
db.people.updateOne({'name':'호랑이2'}, {$set:{age:40}});
앞의 {'name':'호랑이2'}
는 검색 조건, {$set:{age:40}}
는 업데이트 조건
즉, name이 호랑이2인 데이터의 age를 40으로 update한다.
updateOne을 호출하였기 때문에 1개의 데이터만 수정된다.
만약 updateMany를 호출하였다면 {'name':'호랑이2'}
에 해당하는 모든 데이터의 age가 40으로 수정된다.
db.people.updateOne({'name':'호랑이2'}, {$set:{age:40}});
db.people.deleteOne({'name':'호랑이2'});
deleteMany()
를 실행하면 조건을 만족하는 데이터가 모두 삭제된다.
db.people.drop();
dp.people.insertOne({name:'호랑이1', age:10, sal:100});
db.people.find({}, {_id:false});
db.people.updateOne(
{'name':'호랑이1'},
{
$set:{'age':40}
}
);
db.people.replaceOne({'name':'호랑이1'}, {age:999});
updateOne은 문서의 일부 필드를 업데이트하고 그 외의 필드는 그대로 유지하며, replaceOne은 기존 문서를 완전히 대체해버린다.
배열의 형태로 여러개의 데이터를 한번에 삽입할 수 있다.
db.people.insertMany([
{name:'호랑이1', age:10, sal:100},
{name:'호랑이2', age:10, sal:100},
{name:'호랑이3', age:10, sal:100}
]);
아래와 같이 data라는 변수에 데이터를 할당하고 변수를 통해 삽입할 수 있다.
let data = [
{name:'호랑이1', age:10, sal:100},
{name:'호랑이2', age:10, sal:100},
{name:'호랑이3', age:10, sal:100}
]
db.people.insertMany(data);
db.people.find({}, {_id:false});
find()와 다르게 findOne()d은 컬레션에서 첫 번째로 일치하는 문서만 검색한다.
let find = db.people.findOne({name:'호랑이2'});
find
let data = [
{name:'호랑이1', age:10, sal:100},
{name:'호랑이2', age:10, sal:100},
{name:'호랑이3', age:10, sal:100}
]
db.people.insertMany(data);
db.people.find({}, {_id:false});
let find = db.people.findOne({name:'호랑이2'});
find.info = {age:find.age, sal:find.sal}
find.test = {sample:999}
find
delete find.age;
delete find.sal;
find
$gt, $lt, $eq 등과 같은 쿼리 조건을 나타내는 연산자
$set, $inc, $unset 등과 같은 업데이트 동작을 지정하는 연산자
$project, $group, $sort 등과 같은 어그리게이션 파이프라인에서 필드 선택, 그룹화, 정렬 등을 지정하는 연산자
$push, $pull, $addToSet 등과 같은 배열 필드에 대한 연산을 수행하는 연산자
upsert는 "update"와 "insert"의 합성어이다.
일반적으로 updateOne() 또는 updateMany() 메서드와 함께 사용되며, 업데이트 조건에 맞는 문서가 있는 경우 해당 문서를 업데이트하고, 조건에 맞는 문서가 없는 경우에는 새로운 문서를 삽입한다.
db.people.updateOne(
{name:'호랑이1'},
{$set:{age:20}},
{upsert:false}
);
db.people.find({}, {_id:false});
data가 없는 경우, 새로운 문서가 삽입된다.
db.people.updateOne(
{name:'호랑이4'},
{$set:{age:20}},
{upsert:true}
);
db.people.find({}, {_id:false});
$inc는 MongoDB의 업데이트 연산자 중 하나로, 숫자 필드를 증가 또는 감소시키는 데 사용된다.
db.people.drop();
let data = [
{name:'호랑이1', age:10, sal:100},
{name:'호랑이2', age:10, sal:100},
{name:'호랑이3', age:10, sal:100}
]
db.people.insertMany(data);
db.people.updateOne(
{name:'호랑이1'},
{$inc:{age:1, sal:10}},
);
db.people.find({}, {_id:false});
$unset은 MongoDB의 업데이트 연산자 중 하나로, 필드를 제거하는 데 사용된다.
db.people.updateOne(
{name:'호랑이1'},
{$unset:{age:''}},
);
db.people.find({}, {_id:false});
setOnInsert는 MongoDB의 upsert 작업에서 사용되는 업데이트 연산자이다.
db.people.updateOne(
{name:'호랑이1'},
{setOnInsert:{age:20}},
{upsert:true}
);
db.people.find({}, {_id:false});
MongoDB에서 사용되는 업데이트 연산자 중 하나로, 문서 내의 필드 이름을 변경하는 데 사용된다.
db.people.updateOne(
{name:'호랑이1'},
{$rename:{age:'ageage'}},
);
db.people.find({}, {_id:false});
db.people.updateOne(
{name:'호랑이1'},
{$min:{age:5}},
);
db.people.find({}, {_id:false});
MongoDB의 업데이트 연산자 중 하나로, 배열 필드에 값을 추가하는 데 사용된다.
db.people.updateOne({name:'호랑이1'}, {$push:{item:1000}});
db.people.find();
$each는 MongoDB의 업데이트 연산자인 $push와 함께 사용되는 옵션이다.
push 연산자를 사용하여 배열 필드에 여러 값을 추가할 때, $each를 함께 사용하면 한 번에 여러 값을 추가할 수 있다.
db.people.updateOne({name:'호랑이1'}, {$push:{item:{$each:[3000, 4000]}}});
db.people.updateOne(
{name:'호랑이1'},
{$push:
{item:
{$each:[3000, 4000],
$position:1
}
}
}
);
db.people.updateOne(
{name:'호랑이1'},
{$pop:
{item:+1}
}
);
db.people.updateOne({name:'호랑이1'}, {$pull:{item:2000}});
db.people.updateOne({name:'호랑이1'}, {$addToSet:{item:2000}});
db.people.drop();
let data = [
{'name': '호랑이1', 'age':10, 'sal':100, item:[10, 20, 30, 40]}
]
db.people.insert(data);
db.people.updateOne(
{name:'호랑이1'},
{$push:
{item:
{$each:[40, 50, 60, 70],
$slice: +5
}
}
}
);
db.people.find();
db.people.updateOne(
{name:'호랑이1'},
{$push:
{item:
{$each:[],
$sort: -1
}
}
}
);
db.people.find();
db.people.drop();
let data = [
{'name': '호랑이1', 'age':10, 'sal':100,
item:[
{id:1, score:20},
{id:2, score:10},
{id:3, score:40}
]}
]
db.people.insert(data);
db.people.updateOne(
{name:'호랑이1'},
{$push:
{item:
{$each:[],
$sort: {score:1}
}
}
}
);
db.people.find();
db.people.find(
{
age:{
$gt:7
}
}
);
age가 7보다 큰 값을 찾는다.
db.people.find(
{
age:{
$gt:7, $lt: 10
}
}
);
age가 7보다 크고 10보다 작은 값을 찾는다.
MongoDB 쿼리 연산자 중 하나로, 필드의 존재 여부를 검사하는 데 사용된다.
db.people.find({ageage:{$exists:true}})
ageage field가 있는 문서 반환
MongoDB 쿼리 연산자 중 하나로, 필드의 값을 주어진 나머지(modulus) 연산으로 비교하는 데 사용된다.
db.people.find({ age: { $mod: [5, 0] } })
age 필드의 값이 5로 나눈 나머지가 0인 문서를 반환
name: 호랑이 3 && age<10을 만족하는 값 찾기
db.people.insertOne({name:'호랑이3', age:7, sal:100});
db.people.find(
{
name:'호랑이3',
age:{
$lt: 10
}
}
);
그러나, 아래와 같이 동일한 field를 두번 사용하게 되면 앞선 조건만 실행된다.
db.people.find(
{
name:'호랑이3',
age:{
$lt: 10
},
age:{
$lt: 20
}
}
);
/ /
은 문자열의 부분을 나타내는 패턴으로, 어떠한 문자열을 검색할 때 사용한다.
db.people.find(
{name:/^호/}
);
db.people.find(
{name:/3$/}
);
db.people.find(
{name:/호랑/}
);
name: 호랑이 3 && age<10을 만족하는 값 찾기
db.people.find(
{$and:[{name:'호랑이3'}, {age:{$lt:10}}]}
);
name: 호랑이 3 || age<10을 만족하는 값 찾기
db.people.find(
{$or:[{name:'호랑이3'}, {age:{$lt:10}}]}
);