일반 mongoDB의 shell 명령어와 크게 다르지 않습니다만, 옵션을 좀 살펴볼 필요가 있습니다.
우선 간단히 shell, pymongo, mongoose의 메서드를 살펴보면, 유사하다는 것을 알 수 있습니다.
그러니까 어떠한 메서드를 하나 배우면 다른 mongodb 연결 패키지를 사용해도 쓸 수 있습니다.
mongodb shell | pymongo | mongoose |
C : insertOne, insertMany R : find, findOne U : updateOne, updateMany D : deleteOne, deleteMany |
C : insert_one, insert_many R : find_one, find U : update_one, update_many D : delete_one, delete_many |
C : insertOne, insertMany R : find, findOne U : updateOne, updateMany D : deleteOne, deleteMany |
query 관련
(https://mongoosejs.com/docs/queries.html)
findOne 시리즈
findOne, findOneAndUpdate, findOneAndRemove, findOneAndDelete
대체로 무엇을 하는지 알 수 있을 것이다. findOneAndUpdate만 가져와 보았다.
mongoose
(https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate)
findOneAndUpdate(conditions, update, options, callback)
쉽게 말해서 조건에 따라 하나의 도큐먼트를 찾고, 업데이트합니다.
아래 예시는 제가 작성한 mongoose 코드입니다. 해당 조건에 맞는 email을 찾아서, Q1과 Q2를 업데이트 합니다. 만약 조건에 맞는 값이 없으면 옵션에 준 upsert에 따라 새로 생성해버립니다. 모든 일이 끝나면 콜백 함수를 실행합니다.
Email.findOneAndUpdate(
{ email: req.body.email },
{ Q1: req.body.Q1, Q2: req.body.Q2 },
{ upsert: true },
(err, items) => {
if (err) return res.json({ emailAndItemsaved: false, err });
return res.status(200).json({ emailAndItemsaved: true });
}
);
여기서 update와 관련해서 중요한 사실이 있습니다. Update validators are off by default - you need to specify the runValidators option. 즉, 업데이트를 담당하는 update(), updateOne(), updateMany(), and findOneAndUpdate()에는 스키마에 정의한 validation이 작동하지 않습니다.
따라서 옵션에서 runValidators를 true로 지정해줘야 합니다.
var opts = { runValidators: true };
Toy.updateOne({}, { color: 'not a color' }, opts, function (err) {
assert.equal(err.errors.color.message,
'Invalid color');
});
그런데 이 조건을 왜 기본으로 꺼뒀을까요? this와 관련한 이슈가 있기 때문입니다.
관련 사항은 (https://mongoosejs.com/docs/validation.html#update-validators-and-this)를 참고합시다
findById 시리즈
findById, findByIdAndDelete, findByIdAndRemove, findByIdAndUpdate
기타 모델 관련
(https://mongoosejs.com/docs/api/model.html)
create
export const postUpload = async (req, res) => {
const { title, description } = req.body;
const { path, originalname } = req.file;
// Video라는 모델에 근거하여 create를 진행합니다.
// 이 때 내부 속성은 정의한 스키마에 따라야 합니다.
const newVideo = await Video.create({
fileUrl: path,
title,
description,
});
res.redirect(routes.videoDetail(newVideo._id));
};
'DB, ORM > 🍃mongoose, pymongo' 카테고리의 다른 글
mongoose Schema option 이용하기 (0) | 2020.07.23 |
---|---|
모델과의 관계 설정 (임베디드 방식/레퍼런스 방식) (0) | 2020.06.17 |
검색을 빠르게 해주는 mongoDB 인덱스 (pymongo로 작업) (0) | 2020.06.09 |
pymongo/mongoose 쿼리 작성하기 (0) | 2020.06.09 |
pymongo 라이브러리를 통해 python으로 mongodb 조작하기 (0) | 2020.06.08 |