[MongoDB] Model 활용

2020. 12. 18. 01:13Database/MongoDB

1. 연관 동작 수행

MongoDB에서 단일 Document에 대한 쓰기 동작을 유기적으로 수행할 수 있다. 만약 여러 개의 필드가 서로 영향을 미친다면, 같은 Document가 그 필드를 포함하면 효율적으로 동작을 수행할 수 있다.

 

예를 들어 책과 대여가능한 권수, 대여 정보를 유지하는 상황에서 대여가능 권수(available)와 대여 정보(checkout)는 서로 연관되어 처리해야한다.

{
  title: "MongoDB: The Definitive Guide",
  author: ["Kristina Chodorow", "Mike Dirolf"],
  published_date: ISODate("2010-09-24"),
  pages: 216,
  language: "English",
  publisher_id: "oreilly",
  available: 3,
  checkout: [ { by: "joe", date: ISODate("2012-10-15") } ]
}

만약 데이터를 업데이트하는 상황에서는 다음과 같이 처리할 수 있다.

db.books.updateOne {
  { _id: 123456789, available: { $gt: 0 } },
  {
    $inc: { available: -1 },
    $push: { checkout: { by: "name", date: new Date() } }
  }
}

 

 

 

2. 키워드 검색

응용 프로그램에서 텍스트를 저장하는 필드에 대해서 쿼리를 수행하는 경우, 일치하는 텍스트를 찾아 조회해야한다. 이러한 상황에서 MongoDB에서 키워드 검색을 위한 방법은, Document에서 배열 필드를 만들고 키워드를 배열에 문자열로 추가를 한뒤 배열에 키 인덱스를 생성하여 값을 조회하는 방법이 있다.

db.volumes.createIndex( { <field>: "text" } )
db.volumes.createIndex( { topic: "text" } )

키 인덱스를 생성하면 find를 이용하여 문자열 조회를 할 수 있다.

db.volume.findOne( { topics: "voyage" }, { title: 1 } )

 

 

 

3. 화폐 데이터

1) 화폐 데이터

응용프로그램에서 화폐 데이터를 처리할 때, 산술을 처리한다면 정확한 정밀도로 10진수 반올림 처리를 할 수 있는 기능이 필요하다. 현대에서 많이 사용하는 이진 기반 소수점 산술들은 정확한 소수를 표현할 수 없기에 통화 산술에 적합하지 않다. 하지만 MongoDB에서는 화폐 데이터를 산술할 수 있는 기능을 제공한다.

2) 숫자 데이터

10진수 BSON 타입 사용하면 이진 기반 부동소수점 형식과 달리 통화 데이터 처리를 정확하게 할 수 있다. 10진수 값은 NumberDecimal()을 통해 사용할 수 있다. 예를 들어 가스 가격이 포함된 Document 데이터를 gasprices 컬렉션에 포함하는 식은 다음과 같다.

db.gasprices.insert( { "_id": 1, "date": ISODate(), "price": NumberDecimal("2.09"), "station": "Quickstop", "grade": "regular" } )
db.gasprices.find( { price: NumberDecimal("2.09") } )

3) 숫자가 아닌 데이터

숫자가 아닌 데이터를 통화 데이터로 사용하기 위해서는 두 필드에 값을 저장해야한다.

  • 첫 번째 필드는 숫자가 아닌 데이터 유형으로 입력한다. (화폐 데이터를 BinData 혹은 String으로 입력)
  • 두 번째 필드는 정확한 값을 부동 소수점으로 입력한다. (최대 근사치값)
{
  price: { display: "9.99", approx: 9.9900000000000002, currency: "USD" },
  fee: { display: "0.25", approx: 0.2499999999999999, currency: "USD" }
}

[참고] junghwanta.tistory.com/33?category=857330

728x90

'Database > MongoDB' 카테고리의 다른 글

[MongoDB] Sharding  (0) 2020.12.18
[MongoDB] Database 참조  (0) 2020.12.18
[MongoDB] Data Model (Documents간의 관계 설정 구조)  (0) 2020.12.17
[MongoDB] Text Search  (0) 2020.12.17