Back/MongoDB

Mongo DB 실습 - 2

잘잔디 2023. 5. 17. 16:34

문서 갱신

$addToSet 제한자

  • $addToSet 제한자는 배열을 집합처럼 처리하여 중복을 피하고, 입력할 수 있음
  • "type" 키에는 배열의 형태로 apple banana 값들이 입력되어 있고 $addToSet 제한자를 통해 orange 값을 입력하면, orange 값이 없기 때문에 중복을 피하여 입력됨.
  • $each 제한자를 조합하여 고유한 값을 여러 개 추가
  • 마지막 update시에 존재하지 않는 strawberry만 갱신된다.

$pop 제한자

  • $pop 제한자는 배열의 양쪽 끝에서부터 요소를 하나씩 삭제함
    • 값을 1로 부여하면, 배열의 마지막 요소부터 제거
    • 값을 -1로 부여하면, 배열의 처음부터 요소를 제거

$pull 제한자

  • $pull 제한자는 배열 위치랑 상관 없이 주어진 조건에 맞는 배열 요소를 제거
  • $pull 제한자는 배열 요소를 제거하지만, 조건과 일치하는 모든 요소를 제거한다는 주의사항이 있다.

updateMany : 다중 문서 갱신

  • updateOne은 필터 조건에 맞는 첫 번째 문서만 갱신한다.
  • 조건에 맞는 문서가 더 있더라도 갱신하지 않는데, updateMany를 사용하면 필터에 일치하는 모든 문서를 갱신하게 된다. 

쿼리

find()

  • find() 함수는 첫 매개변수에 따라 어떤 문서를 가져올지 결정한다.
  • 빈 쿼리 문서 ({ })로 지정하면 컬렉션 내 모든 문서를 가져오며, 생략이 가능하다.
  • find() 함수를 통해 원하는 필드에 조건을 주어 조회할 순 있지만, 문서 내의 정확한 키/값이 필요 없이 조회하고 싶다면 해당 매개변수에 키의 값을 1로 부여
    • 첫 번째 매개변수는 생략하거나 조건을 주어 필히 작성
    • 마지막 쿼리를 보면 첫 번쨰 매개변수의 name 키의 값을 "Chang"을 가지는 필터의 조건 부여
    • 그리고 두 번째 매개변수의 name 키의 값을 1로 부여하여 name 키와 값을 조회
    • _id 키의 값은 지정하지 않아도 항상 반환하기 때문에 0으로 지정하면 제외가 가능하다.

쿼리 조건

  • $lt  , $ lte , $gt , $gte로 각각 <, <= , > , >=이다.
  • 예시 db.people.find( { age : {$gte : 22 , $lte : 30 }} )   =  age 키값이 22 이상 30 이하인 문서를 조회해서 보여줘라
  • 날짜 값의 쿼리도 가능함.

$ne : Not Equal

  • $ne 연산자는 키의 값이 특정 값과 일치하지 않는 문서를 찾을 때 사용
  • "name" 키의 값에 $ne 연산자를 통해 "lee" 값을 가진 필드를 제외한 문서를 조회

$in

  • $in 연산자는 서로 다른 데이터형에도 사용 가능
  • { age : { $in : [25, 22 ] } }처럼 사용하여 age가 25, 22인 모든 문서들을 불러올 수 있다.

$in, $or 조합

  • age 값이 25,22 이거나, name 값이 'park'인 문서를 모두 반환
db.people.find( {
$or :
[ { age : {$in : [25,22] }},
{ name : "park"}]
} )

$mod

  • $mond 연산자는 나머지 연산을 할 수 있음.
  • 즉, $mod 연산자를 활용할 때는 첫 번째 값으로 나눈 후 그 나머지 값의 조건을 두 번째 값으로 기술함
    • { $mod : [5,0] }으로 주면, 5로 나누어 나머지가 0인 값들로 해석
  • 'age' 키의 값을 5로 나누었을 때 나머지가 0인 문서를 반환
    • 'age' 키의 값이 25인 문서들만 반환
db.people.find({ age : { $mod : [5, 0] } } )

$mod, $not 조합

  • age 키의 값을 5로 나누었을 때 나머지가 0인 문서와 일치하지 않은 문서들을 반환
  • $not 연산자는 정규 표현식과 함께 사용이 가능해 패턴과 일치하지 않는 문서를 찾을 때 특히 유용
db.people.find({ age : { $not : { $mod : [5,0]} } } )

null

  • null은 스스로와 일치하지 않는 문서를 조회
  • "y"의 키가 "null"인 문서를 조회할 수 있음
  • null은 존재하지 않음이라는 의미로 해석되기 때문에 키가 null인 값을 조회하면 해당 키를 가지고 있지 않는 문서도 반환
    • x의 키가 null 인 문서도 조회가 가능

데이터 추가

db.nullcol.insertMany([
{ "_id" : 1, "y" : null },
{ "_id" : 2, "y" : 1 },
{ "_id" : 3, "y" : 2 }
])
  • MongoDB에서 null의 경우 두 가지 의미로 해석된다.
  • 첫째로 값이 null인 경우로 아래 사진의 y:null을 찾을 때의 예시이다.
  • 두 번째로 아래 사진의 x:null을 찾을 때로 해당하는 키 자체가 없는 경우에도 null로 인식한다.

  • 값이 null인 키를 찾고 싶다면, 키가 null인 값을 쿼리하고 exists 조건절을 사용하여 가능

정규표현식

  • $regex는 쿼리에서 패턴 일치 문자열을 위한 정규식 기능을 제공
  • PCRE(Perl Compatible Regular Expression) 라이브러리를 활용하여 해당 문법을 따름
    • / : 문자열의 구분자
    • ^ : 문자열의 처음
    • $ : 문자열의 끝

데이터 추가

db.regexcol.insertMany([
{ "_id" : 1, "sku" : "abc123", "description" : "Single line description." },
{ "_id" : 2, "sku" : "abc789", "description" : "First line\nSecond line" },
{ "_id" : 3, "sku" : "xyz456", "description" : "Many spaces before     line" },
{ "_id" : 4, "sku" : "xyz789", "description" : "Multiple\nline description" }
])
  • 마지막 쿼리문의 /^S/ , $options: 'm'의 경우 대문자 S로 시작하는 여러 줄의 문자열을 가진 필드의 문서를 반환한다.
    • \n의 경우 줄 바꿈으로 인식한다.