본문으로 바로가기

일반 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)

 

shell (https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/#db.collection.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));
};

 

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체