2016-11-08 4 views
2

저는 Couchbase을 완전히 처음 접했고 매우 빠르게 배우면서 중첩 된 필드에 저장된 데이터를 집계하기 위해 쿼리/뷰를 만들 수 있는지 알아보기 위해 고심하고 있습니다. 중첩 된 필드는 불확실합니다. 다음 문서를 고려 예를 들어중첩 된 필드의 Couchbase 집계

:

[ 
    { 
     "customer": 1, 
     "user": 21, 
     "group": 2, 
     "data": { 
      "cat": 2, 
      "dog": 1 
     } 
    }, 
    { 
     "customer": 1, 
     "user": 22, 
     "group": 3, 
     "data": { 
      "cat": 1, 
      "rabbit": 3 
     } 
    }, 
    { 
     "customer": 1, 
     "user": 23, 
     "group": 2, 
     "data": { 
      "budgie": 1, 
      "mouse": 1, 
      "dog": 1 
     } 
    } 
] 

내가 "그룹"과 "고객"에 의한 것 쿼리, 예를 들어, 그룹이 다음과 같은 결과를 생성하고 싶습니다 : (고객/사용자/그룹/데이터)

[ 
    { 
     "customer": 1, 
     "group": 2, 
     "data": { 
      "cat": 2, 
      "dog": 2, 
      "budgie": 1, 
      "mouse": 1 
     } 
    }, 
    { 
     "customer": 1, 
     "group": 3, 
     "data": { 
      "cat": 1, 
      "rabbit": 3 
     } 
    } 
] 

최고 수준의 데이터는 정적 항상 "데이터"자유 형식이다에서 해당 필드하지만, 항목이 포함됩니다.

이것은 Couchbase에서 기본적으로 가능합니까? 아니면 프로그래밍 방식으로 클라이언트 응용 프로그램에서 수행해야합니까?

나는 당분간 프로그램 방식의 해결책을 찾았으나 알아두면 좋을 것이다.

답변

0

이것은 Couchbase 4.5.1에서 작동합니다. 다음 4.6에서 p.value를 p.val로 변경하십시오.

SELECT customer, `group`, OBJECT d.name : d.sum FOR d IN ARRAY_AGG({ "name":name, "sum":sum }) END AS data 
FROM 
(
SELECT d.customer, d.`group`, p.name, SUM(p.`value`) AS sum 
FROM default AS d UNNEST OBJECT_PAIRS(data) AS p 
GROUP BY d.customer, d.`group`, p.name 
) AS s 
GROUP BY customer, `group`; 
+0

Geraldsss, 감사합니다. 버전 4.5에만 해당됩니까? 나는 Community Edition (4.1)에서 "OBJECT d.name : d.sum FOR d IN ARRAY_AGG"가 최근에 소개 된 것으로 평가하고 있다고 가정합니다. 하위 쿼리는 4.1에서 정상적으로 작동하지만 오류로 인해 전체 쿼리가 실패합니다. –

+0

죄송합니다. { "code": 3000, "msg": "구문 오류 - 개체}" –

+0

예, 4.5.1을 사용하십시오. – geraldss