JX405기_비트/mongoDB

Day16-2 MongoDB mongosh를 이용한 CRUD

_하루살이_ 2023. 2. 7. 20:56

CRUD Operations

 

  • Create Operations
    • 컬렉션에 새로운 도큐먼트를 추가하는 연산
    • db.collection.insertOne()
    • db.collection.insertMany()

 

  • Read Operations
    • 컬렉션에서 도큐먼트를 조회하는 연산
    • db.collection.find()
    • 도큐먼트를 식별할 수 있는 쿼리 필터나 기준을 지정할 수 있음

 

  • Update Operations
    • 컬렉션에 존재하는 도큐먼트를 수정하는 연산
    • db.collection.updateOne()
    • db.collection.updateMany()
    • db.collection.replaceOne()

 

  • Delete Operations
    • 컬렉션에서 도큐먼트를 제거하기 위한 연산
    • db.collection.deleteOne()
    • db.collection.deleteMany()

 

Insert Documents

  • 한개의 도큐먼트 삽입

db.inventory.insertOne( { item: "canvas", qty: 100, tags:["cotton"], size : {h:20, w:30, uom: "cm"}})

 

  • 도큐먼트 삽입 후 조회하기

db.inventory.find({item: "canvas" }) 관계형 SQL식 표현 SELETE * FROM inventory WHERE item = 'canvas

 

  • 다수의 도큐먼트 삽입

db.inventory.insertMany([

   { item : "note". qty : 25, tags : ["blank","red"], size : {h:14, w:21, uom : "cm"}},

   { item : "mat", qty : 85, tags : ["gray"], size : {h:28, w:36, uom:"cm"}}, 

   { item : "mousepad", qty : 25, tags : ["gel", "blue"], size : {h:19, w:23, uom:"cm"}}

])

 

  • 도큐먼트 전체 조회하기

db.inventory.find({})

 

  • Insert
    • 컬렉션 생성 : 컬렉션이 존재하지 않는 경우, 컬렉션을 생성한 후 도큐먼트를 삽입
    • _id field : 컬렉션에 저장되는 도큐먼트는 유일한 식별자 역할을 하는 _id필드가 필요함. 도큐먼트를 삽입할 때 _id field를 생략하면 자동적으로 Objectid를 생성하여 _id field 값으로 저장

 

Query Documents

 

  • 모든 도큐먼트 조회

db.inventory.find({}) SQL SELECT * FROM inventory

 

  • 동등비교 {<field1> : <value1>, <field2> : <value2> , ....}

db.inventory.find({status: "D"}) SQL SELECT * FROM inventory WHERE status = "D"

 

  • 쿼리 연산자를 사용한 조건 지정 {<field1> : {<operator1> : <value1>}, ...}
    • Query selector : 모든 도큐먼트에 대해 일치 여부를 검사하기 위한 조건으로 사용

db.inventory.find({status : { $in: ["A", "D"]}}) SQL SELECT * FROM inventory WHERE status in ("A", "D")

 

  • AND 조건

db.inventory.find({status : "A", qty : {$lt: 30}}) SQL SELETE * FROM inventory WHERE status = "A" AND qty < 30

 

  • OR 조건

db.inventory.find({$or : [{status : "A"}, {qty : {$lt: 30}}]}) SQL SELECT * FROM inventory WHERE status = "A" OR qty < 30

 

  • AND, OR 조건

db.inventory.find({ status : "A", $or : [{qty: {$lt : 30 }}, {item: /^p/}]}) SQL SELECT * FRO< inventory WHERE status = "A" AND (qty < 30 OR item LIKE "p%")

값이 일치하고 값의 위치까지 일치하는 요소들 조회

/^p/정규식 p로 시작하는글자


 

Query Selector의 연산자

  • $eq : 특정 값과 같은(=)값을 갖는 경우 참 equal
  • $gt : 특정 값보다 큰(>)값을 갖는 경우 참 greater than
  • $gte : 특정 값보다 크거나 같은(>=)값을 갖는 경우 참
  • $lt : 특정 값보다 작은(<)값을 갖는 경우 참 less than 
  • $lte : 특정 값보다 작거나 같은(<=)값을 갖는 경우 참 
  • $ne : 특정 값과 다른(!=)값을 갖는 경우 참 not equal
  • $nin : 배열에 지정된 값들과 일치하지 않는 경우 참 not in
  • $in : 배열에 지정된 값들 중 일치하는 값을 갖는 경우 참 

내장 도큐먼트 쿼리

 

  • 내장도큐먼트 : 필드(키)에 대한 값이 도큐먼트로 구성된 경우 이르르 내장 도큐먼트라고 함

db.inventory.insertMany([ {item : "journal", qty : 25, size : {h :14, w: 21, uom: "cm"}, status:"A"}, {}, ....)

  • 내장 도큐먼트의 필드에 대한 동등 조건 지정

db.inventory,find({size : {h:14, w: 21, uom:"cm"}})

 

  • Nested field에 대해 동등 비교 조건 지정하기

db.inventory.find({"size.uom" : "in"})

 

  • Query selector를 이용한 조건 지정하기 { <field1> : { <operator1> : <value1>}, {}, ...}

db.inventory.find({"size.h" : {$lt: 15}})

 

  • AND조건(,) 지정하기

db.inventory.find({"size.h" : {$lt : 15}, "size.uom" : "in", status:"D"})

 

배열 요소 쿼리

  • 값이 정확하게 일치하는 경우 찾기 → 값의 위치까지도 동일해야함

db.inventory.find({tag:["red", "blank"]})

 

  • 값을 포함하고 있는 요소들 조회하기

db.inventory.find({tags : { $all : ["red", "blank"]}})

값을 포함하고 있는 요소들 조회

  • 배열 필드에 지정된 값을 가진 요소가 하나 이상 있는지 조회

db.inventory.find({tags: "red"})

 

  • Query operator를 사용하기

db.inventory.find({dim_cm : {$gt:25}})

 

  • 여러 조건 지정하기

db.inventory.find({dim_cm : {$gt: 15, $lt:20}})

 

  • 여러 조건을 만족하는 배열 요소 쿼리 ($elemMatch)
    • 지정된 조건을 모두 충족하는 배열 요소 쿼리

db.inventory.find({ dim_cm : {$elemMatch: {$gt: 22, $lt: 30}}})

 

  • 배열 인덱스로 쿼리(인덱스는 0부터 시작)

db.inventory.find({ "dim_cm.1" : {$gt: 25}})

 

  • 배열의 길이(크기)로 쿼리 ($size)

db.inventory.find({"tags" : {$size:3}}) // tags필드의 배열의 크기가 3인 document출력

 

  • 배열 내부의 도큐먼트 쿼리

db.inventory.find({"instock" : {warehouse: "A", qty: 5}})

 

  • 도큐먼트 배열에 포함된 필드에 조건 지정하기

db.inventory,find({"instock.qty" : {$lte : 20}})

 

  • 배열 인덱스로 내장 도큐먼트에서 쿼리하기

db.inventory.find({'instock.0.qty' : {$lte:20}})

 

  • $elemMatch를 이용한 다중 조건 지정하기

db.inventory.find({"instock" : { $elemMatch : {qty : { $gt: 10, $lte: 20}}}})

 


 

프로젝션(projection)

 

  • 특정 필드들 조회하기

db.inventory.find({status : "A"}, {item : 1, status : 1}) SQL SELECT item, status FROM inventory WHERE status = "A"

 

  • 특정 필드들 제외시키기 

db.inventory.find({status : "A"}, {status : 0, instock: 0})

 

  • 내장 도큐먼트의 특정 필드 출력

db.inventory.find({status : "A"}, {item : 1, status : 1, "size.uom" : 1})

 

  • 내장 도큐먼트의 특정필드 제외시키기

db.inventory.find({status : "A", {"size.uom" : 0})

 

  • 배열 내의 내장 도큐먼트 프로젝션

db.inventory.find({status : "A"}, {item : 1, status : 1, "instock.qty" : 1})

 


Null 또는 존재하지 않는 필드 쿼리

 

db.inventory.insertMany([ { _id:1, item: null} , {_id : 2} ])

 

item 필드가 null이거나 없는 경우 쿼리

db.inventory.find({item:null})

 

필드를 포함(해당 필드가 존재하지 않음)하지 않는 도큐먼트 쿼리

db.inventory.find({item : {$exists : false}})


도큐먼트 갱신

  • 필드 값을 $set과 같은 갱신 연산자를 이용하여 수정하기

db.inventory.updateOne( {item:"paper"}. { $set : {"size.uom" : "cm", status : "P"}, $currentDate : {lastModified : true}}) 

size.uom, status는 수정

lastModified는 새로 추가 → 스키마가 없으므로 필드 추가가 자유로움

 

  • 여러 도큐먼트 갱신하기 

db.inventory.updateMany({"qty" : {$lt : 50}}, {$set : {"size.uom": "in", status: "P"}, $currentDate : {lastModified: true}})

 

db.inventory.replaceOne({item: "paper"} , {item: "paper", instock : [{warehouse : "A", qty : 60}, {warehouse : "B", qty: 40}]})


도큐먼트 삭제

 

  • 여러 도큐먼트 삭제하기

db.inventory.deleteMany({status: "A"})

 

  • 한개의 도큐먼트 삭제하기

db.inventory.deleteOne({status : "D"})