[빅데이터시스템설계] 기본 쿼리

Future·2024년 4월 25일
0

find() - 조회

db.컬렉션_이름.find(query, projection, options)

**query : 조건 / projection : 필드 선택

비교 연산자

  • 형식
    필드명 : {비교_연산자 : 값}

ex)

  • $eq : ==
db.컬렉션_이름.find({필드명 : {$eq : 값}})
db.컬렉션_이름.find({필드명 : 값})				// $eq는 생략 가능
  • $gt : >
  • $gte : >=
  • $lt : <
  • $lte : <=
  • $ne : !=
db.컬렉션_이름.find({필드명 : {$ne : 값}})	
  • $in : 해당 필드에 각 값들 중 하나라도 들어있는 document 조회
db.컬렉션_이름.find({필드명 : {$in : [값, 값, 값]}})	
  • $nin : 해당 필드에 각 값들 중 어느 것도 포함되지 않는 document 조회

논리 연산자

ex)

  • $and
db.컬렉션_이름.find({$and : [{필드명 : 값}, {필드명 : {$lte : 값}]})

$and는 다음과 같이 줄여서 쓸 수 있다.

db.컬렉션_이름.find({필드명 : 값}, {필드명 : {$lte : 값}, {필드명 : 값})
  • $not : 해당 조건을 제외한 나머지 조회
db.컬렉션_이름.find({필드명 : {$not : {$gt : 값}}})
  • $nor : 해당 조건들 중 어느것도 만족하지 않는 값 조회
db.컬렉션_이름.find({필드명 : {$nor : [{$lte : 값}, {$gte : 값}]}})
  • $or
db.컬렉션_이름.find({$or : [{필드명 : 값}, {필드명 : 값}, {필드명 : {$gt : 값}]})

embedded document 조회

embedded document 조회할 때는 주의해야 할 것이 있다.
예를 들어,

{
  "name": "John",
  "address": {
    "city": "New York",
    "zipcode": "10001"
  },
  "age": 30
},
{
  "name": "Alice",
  "address": {
    "city": "Los Angeles",
    "zipcode": "90001"
  },
  "age": 25
},
{
  "name": "Michael",
  "address": {
    "city": "Chicago",
    "zipcode": "60601"
  },
  "age": 35
},
{
  "name": "Sophia",
  "address": {
    "city": "New York",
    "zipcode": "10002"
  },
  "age": 27
}

이런 데이터가 있다고 할 때, city가 New York인 사람을 조회하고 싶다고 하자.

db.test.find({address : {city : "New York"}})

이렇게 하면 될까 ?
아니다.

db.test.find({address : {zipcode : "10001", city : "New York"}})

이 쿼리는 순서가 맞지 않기 때문에 안된다.
dot notation을 쓰지 않고 embedded document를 조회할 때는 해당 document의 모든 필드를 순서에 맞게 써줘야 한다.

db.test.find({address : {city : "New York", zipcode : "10001"}})

이렇게 하면 조회가 된다.

그러나, 처음에 우리가 원했던 결과는 아니다. 우리가 원했던 결과는 city가 New York인 사람을 조회하는 것이기 때문에, 결과가 두개가 나와야 한다. 이때 dot notation을 사용한다.

dot notation

city가 New York인 사람을 조회하려면 다음과 같이 하면 된다.

db.test.find({"address.city" : "New York"})


주의할 점은, dot notation을 사용할 때, ""를 써야한다는 것이다.

db.test.find({address.city : "New York"})

위와 같이 쿼리를 작성하면

에러가 난다.

Projection

조회를 할 때, 반환되는 필드를 제어하는 기능이다.
1과 0을 사용하는데, 1은 포함, 0은 제외이다.
참고로, _id는 설정을 하지 않으면 무조건 포함되기 때문에, _id를 제외하고 싶으면 꼭 {__id : 0}을 넣어줘야 한다.
이때, _id를 제외한 필드에 0과 1을 혼합하여 쓰면 안된다.

{
  "name": "John",
  "address": {
    "city": "New York",
    "zipcode": "10001"
  },
  "age": 30
},
{
  "name": "Alice",
  "address": {
    "city": "Los Angeles",
    "zipcode": "90001"
  },
  "age": 25
},
{
  "name": "Michael",
  "address": {
    "city": "Chicago",
    "zipcode": "60601"
  },
  "age": 35
},
{
  "name": "Sophia",
  "address": {
    "city": "New York",
    "zipcode": "10002"
  },
  "age": 27
}

ex)

  • name만 조회
db.test.find({}, {_id : 0, name : 1})
  • name 빼고 모두 조회
db.test.find({}, {name : 0})
  • city가 Chicago인 document age 빼고 모두 조회
db.test.find({"address.city" : "Chicago"}, {age : 0})

**조건과 projection을 함께 쓸 때는 다음과 같은 순서로 쓴다

db.collection.find({ condition }, { projection })

update() - 데이터 수정

db.컬렉션_이름.update(query, 업데이트될_document)

update는 deprecated되었다. updateOne()이나 updateMany()를 사용하기

{
  "name": "John",
  "address": {
    "city": "New York",
    "zipcode": "10001"
  },
  "age": 30
},
{
  "name": "Alice",
  "address": {
    "city": "Los Angeles",
    "zipcode": "90001"
  },
  "age": 25
},
{
  "name": "Michael",
  "address": {
    "city": "Chicago",
    "zipcode": "60601"
  },
  "age": 35
},
{
  "name": "Sophia",
  "address": {
    "city": "New York",
    "zipcode": "10002"
  },
  "age": 27
}

ex)

  • city가 New York인 document의 city를 NoNoNo로 변경
db.test.update({"address.city" : "New York"}, $set : {"address.city" : "NoNoNo"})

기본적으로 update()는 값이 일치하는 첫번째 document를 수정함.

  • city가 New York인 모든 document의 city를 NoNoNo로 변경 (multi 옵션)
db.test.update({"address.city" : "New York"}, {$set : {"address.city" : "NoNoNo"}}, {multi : true})

update() - 데이터 수정

updateOne() - 가장 첫번째 document 수정

db.test.updateOne({"address.city" : "New York"}, $set : {"address.city" : "NoNoNo"})```

updateMany() - 모든 document 수정

db.test.updateMany({"address.city" : "New York"}, $set : {"address.city" : "NoNoNo"})```

remove() - 데이터 삭제

deleteOne() - 가장 첫 번째 데이터 삭제

db.test.deleteOne({"address.city" : "New York"})

deleteMany() - 모든 데이터 삭제

db.test.deleteMany({"address.city" : "New York"})
profile
Record What I Learned

0개의 댓글