2015-02-03 2 views

답변

1

불행히도 ReQL은 (see github issue #866) 순간 반올림을 지원하지 않지만 약간의 사소한 불만으로 비슷한 결과를 얻을 수 있습니다.

우선, 정기적으로 또는 대용량 데이터 세트를 실행하려는 경우이 테이블을 색인으로 만드는 것이 좋습니다. 여기에있는 함수는 숫자를 반올림 할 수 없기 때문에 가장 효율적이지 않습니다. 색인을 사용하면 많은 것을 줄일 수 있습니다.

참조 된 특정 언어가 없기 때문에이 코드 샘플은 Python으로되어 있습니다. 0[0-100)을 위치를 나타냅니다 가격을 기준으로 보조 인덱스를 생성합니다

r.db('foo').table('bar').index_create('price_range', 
    lambda row: row['price'].coerce_to('STRING').split('.')[0].coerce_to('NUMBER') 
        .do(lambda x: x.sub(x.mod(100)))).run() 

이, 100[100-200), 등 : 인덱스, 같은 실행 뭔가를 만듭니다. 이 시점에서, 그룹 별은 간단하다 :

r.db('foo').table('bar').group(
    lambda row: row['price'].coerce_to('STRING').split('.')[0].coerce_to('NUMBER') 
        .do(lambda x: x.sub(x.mod(100)))).run() 

이 질의 : 당신이 정말로 오히려 인덱스를 생성하지 않을 경우

r.db('foo').table('bar').group(index='price_range').run() 

이 매핑은 단일 쿼리에서 group 동안 수행 할 수 있습니다 상당히 직설적이지만 무슨 일이 일어나고 있는지를 문서화하기 위해 :

  • coerce_to('STRING') - 우리는 숫자의 문자열 표현을 얻습니다. 318.12"318.12"이됩니다.
  • split('.') - 문자열을 소수점으로 나눕니다 (예 : "318.12". ["318", "12"]이됩니다. 소수점이 없으면 다른 모든 것은 여전히 ​​작동해야합니다.
  • [0] - 우리는 분할 문자열의 첫 번째 값을 취합니다. 이는 원래의 숫자를 반올림 한 것과 같습니다. 예 : "318".
  • coerce_to('NUMBER') - 문자열을 정수로 다시 변환하므로 모듈로 산술 연산을 수행 할 수 있습니다. "318"318이됩니다.
  • .do(lambda x: x.sub(x.mod(100))) - (본질적으로) x = x - (x % 100)을 실행하여 결과 정수를 가장 가까운 100으로 반올림합니다. 318300이됩니다.