달력

10

« 2018/10 »

  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
2018.10.19 17:31

[MongoDB] 도큐먼트 유효성 체크 Tips/MongoDB2018.10.19 17:31

MongoDB와 같은 NoSQL의 최대 장점이자 단점은  Schema-Free입니다. 

즉 데이터를 넣을 공간을 미리정의할 필요가 없다는 것이죠.

그래서 도큐먼트마다 필드의 갯수나 타입도 다양하게 저장해서 활용할 수 있습니다.

스키마가 없으니 데이터를 저장할 때 편하지만, 개발자 실수로 원하지 않은 도큐먼트가

추가되는 일이 흔히 발생합니다.

MongoDB에서는 RDBMS의 제약조건과 비슷한 기능으로 이런 단점을 보완할 수 있습니다.

"collMod" 명령으로 컬렉션에 유효성을 추가할 수 있는데, "collMod"는 'dbAdmin' 역할이 필요합니다.


해당 데이터베이스 유저중 하나에 'dbAdmin' 역할(role)를 부여하고, 그 계정으로 접속한 다음에

유효성을 추가하면 됩니다.

예시로 member라는 컬렉션에 no라는 필드가 반드시 존재해야 한다는 유효성을 추가해 보겠습니다.

db.runCommand(

{

collMod:"member",

validator:{no:{$exists:true}},

validationLevel:"strict",

validationAction:"error"

}

)


<<TEST>>

db.member.insert( {nm:'홍길동', gender:'남'}) ;

위와 같이 도큐먼트를 추가하려고 하면, no 필드가 존재하지 않기 때문에

도큐먼트는 추가되지 않고 에러가 발생합니다.


<< 경험>>

저는 주요 컬렉션에 Primary Key에 해당하는 필드에는 존재 유무를 체크하는 유효성을, 계산 값에 사용되는 특정 필드 (ex. 가격, 수수료)에는  데이터 타입(int, double) 유효성 체크를 설정함으로써 유효하지 않은 도큐먼트가 컬렉션에 추가되는 것을 방지하고 있습니다. 


Posted by dev4u 데브포유

csv 파일을 특정 컬렉션에 import 할 때 필드의 데이터 타입이 원하지 않게 들어가는 경우가 있습니다.

예를 들어 123 값을 숫자가 타입이 아니라 문자열 데이터로 넣어야 하는데 별도 지정이 없으면 숫자로 들어

가는 경우가 있습니다.

csv 파일에서 필드의 구분은 ","로 할 뿐 각각의 데이터가 문자열인지 숫자인지 구분이 안되기 때문에

아래와 같이 두가지 방법으로 이것을 해결할 수 있습니다.


첫번째 방법

csv 파일 첫번째 줄에 필드명과 데이터 타입을 아래와 같이 넣어 주면 됩니다.

---------------------- a.csv ----------------------------------

member_no.string(), name.string()

1234,홍길동

----------------------------------------------------------------

그리고 mongoimport 옵션에 --type csv --columnsHaveTypes --headerline  추가해 주면 됩니다.


두번째 방법

필드명과 타입을 csv 파일이 아닌 mongoimport 파라미터로 지정하는 방법입니다.

mongoimport --db users --collection contacts --type csv --columnsHaveTypes --fields "member_no.string(),name.string()" --file /a.csv


<< 경험 >>

NoSQLBooster 에 있는 데이터 import 기능을 통해서 필드에 데이터 타입을 지정하는 것이 쉽지가 않습니다.

PC에 있는 csv 파일을 import할 때는 커맨드(cmd) 창에서 하시는 것을  추천합니다. (스트레스 50% 줄여 드려요)


필드 타입으로 지정할 수 있는 값들 입니다.

typeSupported ArgumentsExample Header Field
auto()None.misc.auto()
binary(<arg>)user thumbnail.binary(base64)
boolean()None.verified.boolean()
date(<arg>)Alias for date_go(<arg>)Go Language time.Parse format.created.date(2006-01-02 15:04:05)
date_go(<arg>)Go Language time.Parse formatcreated.date_go(2006-01-02 15:04:05)
date_ms(<arg>)Microsoft SQL Server FORMAT formatcreated.date_ms(yyyy-MM-dd H:mm:ss)
date_oracle(<arg>)Oracle Database TO_DATE format.created.date_oracle(YYYY-MM-DDHH24:MI:SS)
decimal()Noneprice.decimal()
double()None.revenue.double()
int32()None.followerCount.int32()
int64()None.bigNumber.int64()
string()None.zipcode.string()


참조: https://docs.mongodb.com/manual/reference/program/mongoimport/#example-csv-import-types

Posted by dev4u 데브포유
2018.10.02 21:04

[MongoDB] 조건문 사용하기 Tips/MongoDB2018.10.02 21:04

if~ 문과 같은 조건문을 MongoDB에서는 아래과 같이 사용하실 수 있습니다.

{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case-> } }

또는

{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }


위 구문처럼 $cond 오퍼레이터를 사용하면 else if 를 사용할 수 없습니다.

else if 처럼 다중 비교문이 필요하다면 $switch 오퍼레이터를 사용해야 합니다.

{ $switch: {

branches: [ { case: <expression>, then: <expression> }, { case: <expression>, then: <expression> }, ... ], default: <expression> }

}

$cond와 $switch는 aggregate stage에서 $group, $project 모두에서 사용할 수 있습니다.

Posted by dev4u 데브포유