[빅데이터시스템설계] 중급 쿼리

Future·2024년 4월 25일
0
{
  "_id": {"$oid": "662a46b69760939bcbe10ba6"},
  "item": "journal",
  "qty": 25,
  "tags": ["blank", "red"],
  "dim_cm": [14, 21]
},
{
  "_id": {"$oid": "662a46b69760939bcbe10ba7"},
  "item": "notebook",
  "qty": 50,
  "tags": ["red", "blank"],
  "dim_cm": [14, 21]
},
{
  "_id": {"$oid": "662a46b69760939bcbe10ba8"},
  "item": "paper",
  "qty": 100,
  "tags": ["red", "blank", "plain"],
  "dim_cm": [14, 21]
},
{
  "_id": {"$oid": "662a46b69760939bcbe10ba9"},
  "item": "planner",
  "qty": 75,
  "tags": ["blank", "red"],
  "dim_cm": [22.85, 30]
},
{
  "_id": {"$oid": "662a46b69760939bcbe10baa"},
  "item": "postcard",
  "qty": 45,
  "tags": ["blue"],
  "dim_cm": [10, 15.25]
}

array에 대한 쿼리

  • array 전체가 정확히 일치하는 document 조회
db.test2.find({tags : ["red", "blank"]})

  • array에 해당 값이 포함되는 document 조회
db.test2.find({tags : "red"})

-> tags에 red가 포함된 4개 document 조회

  • array의 인덱스로 접근하여 조회
db.test2.find({"dim_cm.0" : {$gt : 20}})

  • array의 인덱스로 접근하여 조회 (여러개 조건으로)
db.test2.find({"tags.0" : "blank", "dim_cm.0" : {$gt : 20}})

{
  "_id": {"$oid": "662a50369760939bcbe10bab"},
  "item": "NORWAY",
  "instock": [
    {
      "warehouse": "A",
      "qty": 5
    },
    {
      "warehouse": "C",
      "qty": 15
    }
  ]
},
{
  "_id": {"$oid": "662a50369760939bcbe10bac"},
  "item": "notebook",
  "instock": [
    {
      "warehouse": "C",
      "qty": 5
    }
  ]
},
{
  "_id": {"$oid": "662a50369760939bcbe10bad"},
  "item": "paper",
  "instock": [
    {
      "warehouse": "A",
      "qty": 60
    },
    {
      "warehouse": "B",
      "qty": 15
    }
  ]
},
{
  "_id": {"$oid": "662a50369760939bcbe10bae"},
  "instock": [
    {
      "warehouse": "A",
      "qty": 40
    },
    {
      "warehouse": "B",
      "qty": 5
    }
  ]
},
{
  "_id": {"$oid": "662a50369760939bcbe10baf"},
  "item": null,
  "instock": [
    {
      "warehouse": "B",
      "qty": 15
    },
    {
      "warehouse": "C",
      "qty": 35
    }
  ]
}

array에 대한 쿼리2

  • array에서 해당 document가 포함된 document 찾기
db.test3.find({"instock" : {warehouse : "B", qty : 15}})


다음과 같이 순서가 바뀌면 안된다.

db.test3.find({"instock" : {qty : 15, warehouse : "B"}})
  • dot notation으로 해당 document가 포함된 document 조회
db.test3.find({"instock.qty" : {$gte : 40}})

  • dot notation으로 array의 인덱스를 이용하여 해당 document가 포함된 document 조회
db.test3.find({"instock.0.qty" : {$lte : 5}})

  • 배열의 크기가 "몇" 이상인 document 구하기
db.test3.find({"instock.1.qty : {$gte : 0}})

element operations

{
  "_id": {"$oid": "662a57859760939bcbe10bb0"},
  "item": "NORWAY",
  "instock": [
    {
      "warehouse": "A",
      "qty": 5
    },
    {
      "warehouse": "C",
      "qty": 15
    }
  ]
},
{
  "_id": {"$oid": "662a57859760939bcbe10bb1"},
  "item": "notebook",
  "instock": [
    {
      "warehouse": "C",
      "qty": 5
    }
  ]
},
{
  "_id": {"$oid": "662a57859760939bcbe10bb2"},
  "item": "paper",
  "instock": [
    {
      "warehouse": "A",
      "qty": 60
    },
    {
      "warehouse": "B",
      "qty": 15
    }
  ]
},
{
  "_id": {"$oid": "662a57859760939bcbe10bb3"},
  "instock": [
    {
      "warehouse": "A",
      "qty": 40
    },
    {
      "warehouse": "B",
      "qty": 5
    }
  ]
},
{
  "_id": {"$oid": "662a57859760939bcbe10bb4"},
  "item": null,
  "instock": [
    {
      "warehouse": "B",
      "qty": 15
    },
    {
      "warehouse": "C",
      "qty": 35
    }
  ]
}

$exists

  • 해당 key의 value가 null이거나, key 자체가 없는 document 조회
db.test4.find({item : null})

  • (해당 key의 value가 null이 거나, key 자체가 없는 document)를 제외하고 모두 조회
db.test4.find({item : {$ne : null}})

-> 위의 결과를 제외한 3개 document 조회

  • 해당 key 자체가 없는 document 조회
db.test4.find({item : {$exists : false}})

  • 해당 key 자체가 없는 document 제외하고 모두 조회
db.test4.find({item : {$exists : true}}, {_id : 0})

-> 위의 결과를 제외한 4개 document 조회

{
  "_id": 1,
  "name": "Alice King",
  "classAverage": 87.33333333333333
},
{
  "_id": 2,
  "name": "Bob Jenkins",
  "classAverage": "83.52"
},
{
  "_id": 3,
  "name": "Cathy Hart",
  "classAverage": "94.06"
},
{
  "_id": 4,
  "name": "Drew Williams",
  "classAverage": 93
}

$type

$type은 필드의 데이터 형식을 기반으로 조회할 때 사용된다. 이때, 각 타입에는 숫자가 지정돼있는데, 다음과 같다.

  • 특정 필드가 string인 document 조회
db.test5.find({classAverage : {$type : "string"}})


다음과 같이 해도 결과는 같다.

db.test5.find({classAverage : {$type : 2}})
  • 특정 필드가 string 또는 double인 document 조회
db.test5.find({classAverage : {$type : ["string", "double"]}})

Regular Expression

{
  "_id": {"$oid": "662a60839760939bcbe10bb5"},
  "item": "journal",
  "qty": 25,
  "size": {
    "h": 14,
    "w": 21,
    "uom": "cm"
  },
  "status": "D"
},
{
  "_id": {"$oid": "662a60839760939bcbe10bb6"},
  "item": "notebook",
  "qty": 50,
  "size": {
    "h": 8.5,
    "w": 11,
    "uom": "in"
  },
  "status": "A"
},
{
  "_id": {"$oid": "662a60839760939bcbe10bb7"},
  "item": "paper",
  "qty": 100,
  "size": {
    "h": 8.5,
    "w": 11,
    "uom": "in"
  },
  "status": "D"
},
{
  "_id": {"$oid": "662a60839760939bcbe10bb8"},
  "item": "planner",
  "qty": 75,
  "size": {
    "h": 22.85,
    "w": 30,
    "uom": "cm"
  },
  "status": "D"
},
{
  "_id": {"$oid": "662a60839760939bcbe10bb9"},
  "item": "paper",
  "qty": 45,
  "size": {
    "h": 10,
    "w": 15.25,
    "uom": "cm"
  },
  "status": "A"
}

ex)

  • ^ : 해당 문자열로 시작하는 필드 찾기
db.test6.find({item : {$regex : "^note"}})	// note로 시작하는 문자열

  • $ : 해당 문자열로 끝나는 필드 찾기
db.test6.find({item : {$regex : "nal$"}})

  • i 옵션 : 대소문자를 구분하지 않고 정규표현식 적용
db.test6.find({item : {$regex : "PAPER", $options : "i"}})

profile
Record What I Learned

0개의 댓글