티스토리 뷰

안녕하세요. 여행의 직구 개발자 jun 입니다.


이번에 몽고 3.6 버전으로 업데이트 되면서 많은 기능이 개편되었는데요.


그 중에서도!! 아주 유용한 배열을 식별자를 통하여 바로 검색하여 업데이트 할 수 있도록 개편이 되었습니다.


3.6 버전 부터 적용 되기 때문에 꼭 몽고DB를 업데이트해주셔야합니다!!


가장 중요한점!!!  3.6 이전에 버전에서 저장되어 있던 db 데이터들 또한 dump파일을 만드시고 몽고DB 3.6 버전이상에서 restore하셔야 사용가능합니다!


그냥 몽고DB 버전만 업데이트하시고 사용하시면 identifier가 적용 안되니 꼭 주의해주시길 바랍니다. ^-^


일단 간단히 예시 부터 보도록 합시다.


공식 문서 : https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/index.html


공식 문서에 있는 예시를 가져와 봤습니다.


[1] 필터를 이용하여 조건에 해당하는 배열값 변경


1) 만약 이러면 students라는 db데이터들이 있다고 생각해봅시다.


{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] }
{ "_id" : 3, "grades" : [ 95, 100, 100 ] }


2) 여기에 있는 db데이터들중에 grades 배열 값중에 100 이상인 값들을 찾아 모두 100점으로 통일을 하고 싶다고 한다면 아래와 같이 작성해주시면 됩니다.

여기서 element 라는 이름은 다른 이름으로 변경하셔도 상관없습니다. 하지만 꼭 arrayFilters 값과 $[] 값은 꼭 똑같이 해주셔야합니다.


students.update( { }, { $set: { "grades.$[element]" : 100 } }, {

arrayFilters: [ { "element": { $gte: 100 } } ] } )


3) 2번이 작동한다면 다음과 같이 db데이터들이 변경됩니다.


{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 100 ] } { "_id" : 3, "grades" : [ 95, 100, 100 ] }



[2] 필터를 이용하여 배열인의 json값 변경


1) students2라는 db데이터 입니다.


{
   "_id" : 1,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 6 },
      { "grade" : 85, "mean" : 90, "std" : 4 },
      { "grade" : 85, "mean" : 85, "std" : 6 }
   ]
}
{
   "_id" : 2,
   "grades" : [
      { "grade" : 90, "mean" : 75, "std" : 6 },
      { "grade" : 87, "mean" : 90, "std" : 3 },
      { "grade" : 85, "mean" : 85, "std" : 4 }
   ]
}


2) 이번엔 grade가 85 이상인 값들인 데이터들을 mean 이 100이 되도록 수정한다고 생각합시다.


db.students2.update(
   { },
   { $set: { "grades.$[elem].mean" : 100 } },
   {
     multi: true,
     arrayFilters: [ { "elem.grade": { $gte: 85 } } ]
   }
)


3) 결과값은 이렀습니다.


{
   "_id" : 1,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 6 },
      { "grade" : 85, "mean" : 100, "std" : 4 },
      { "grade" : 85, "mean" : 100, "std" : 6 }
   ]
}
{
   "_id" : 2,
   "grades" : [
      { "grade" : 90, "mean" : 100, "std" : 6 },
      { "grade" : 87, "mean" : 100, "std" : 3 },
      { "grade" : 85, "mean" : 100, "std" : 4 }
   ]
}



검색쿼리는 $gte 말고도 $ne, $lte 등등 다 가능합니다.

이번 3.6 버전으로 업데이트 되면서 몽고가 더욱더 편리해졌군요. 넘모 좋군여


상세한 내용을 더 알고 싶으시다면 공식문서를 참고하셔서 더 공부하시면 될것같습니다.

감사합니다 :)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함