문제

나는 조인 뷰를 생성하기 위해 일반적인 트릭을 사용하고 있습니다.

// a Customer has many Orders; show them together in one view:
function(doc) {
  if (doc.Type == "customer") {
    emit([doc._id, 0], doc);
  } else if (doc.Type == "order") {
    emit([doc.customer_id, 1], doc);
  }
}

다음 쿼리를 사용하여 단일 결과를 얻을 수 있다는 것을 알고 있습니다. customer 그리고 관련된 모든 것 Order에스:

?startkey=["some_customer_id"]&endkey=["some_customer_id", 2]

하지만 이제 쿼리를 묶었습니다. 매우 내 뷰 코드와 밀접하게 연관되어 있습니다."2"라고 더 명확하게 말하면 "나는 원한다" 모든 것 이 고객과 연결되어 있습니까?"내 생각엔 내가 본 것 같아

?startkey=["some_customer_id"]&endkey=["some_customer_id", {}]

그러나 나는 그것이 확실하지 않다 {} ~이다 확실한 정렬하다 ~ 후에 그 밖의 모든 것.

신용 cmlenz 조인 방법에 대해.

추가 설명은 다음과 같습니다. 대조에 대한 CouchDB 위키 페이지:

쿼리 startkey=["foo"]&endkey=["foo",{}] 다음과 같이 첫 번째 요소의 "foo"가 있는 대부분의 배열 키와 일치합니다. ["foo","bar"] 그리고 ["foo",["bar","baz"]].그러나 일치하지 않습니다 ["foo",{"an":"object"}]

그래서 {} ~이다 늦은 정렬 순서대로 되어 있지만 확실히 그렇지는 않습니다. 마지막.

도움이 되었습니까?

해결책

찾으려고하는 대신 가장 큰 가능한 값 배열 키의 요소는 대신 최소 가능한 값보다 큰 값 첫 번째: ?startkey=["some_customer_id"]&endkey=["some_customer_id\u0000"]&inclusive_end=false.

다른 팁

나는 두 가지 생각을 가지고 있습니다.

타임스탬프 사용

대조 동작에 단순한 0과 1을 사용하는 대신, 레코드가 생성된 타임스탬프(레코드의 일부라고 가정)를 사용하세요. [doc._id, doc.created_at].그런 다음 충분히 이른 날짜의 시작 키(에포크는 아마도 작동할 것임)와 "지금"의 끝 키를 사용하여 뷰를 쿼리할 수 있습니다. date +%s.해당 키 범위에는 항상 모든 항목이 포함되어야 하며 날짜별로 대조하는 추가 이점도 있습니다. 이는 아마도 여러분이 원하는 것일 것입니다.

아니면 그냥 걱정하지 마세요.

customer_id로만 색인을 생성할 수 있으며 그 이상은 없습니다.이것은 단지 다음을 사용하여 쿼리할 수 있다는 좋은 이점이 있습니다. key=<customer_id>.물론, 기록이 돌아올 때 대조되지는 않지만 그것이 귀하의 지원서에 문제가 됩니까?엄청난 양의 레코드가 다시 반환될 것으로 예상하지 않는 한, 애플리케이션에서 데이터를 검색한 후에는 고객 레코드를 목록에서 간단히 뽑아내는 것이 쉽지 않을 것입니다.

예를 들어 루비에서는:

customer_records = records.delete_if { |record| record.type == "customer" }

어쨌든 타임스탬프는 아마도 귀하의 사례에 대한 더 매력적인 답변일 것입니다.

CouchDB는 대부분 Erlang에서 작성되었습니다. 스트링 컴파운드/복합 키 튜플 크기에 대한 상한이 시스템 리소스 (예 : 사용 가능한 모든 메모리를 사용하여 너무 오래 사용)에 대한 상한이 있다고 생각하지 않습니다. CouchDB 확장 성의 한계는 CouchDB 사이트에 따라 알려져 있지 않습니다. 필드를 거대한 복합 기본 키에 계속 추가 할 수 있다고 생각합니다. 그리고 당신을 막을 수있는 유일한 것은 목표 아키텍처의 최대 정수 크기와 같은 시스템 리소스 또는 하드 제한입니다.

CouchDB는 JSON을 사용하여 모든 것을 저장하기 때문에 ECMAScript 표준에 의해 가장 큰 숫자 값으로 제한 될 수 있습니다. JavaScript의 모든 숫자는 부동 소수점 IEEE 754 DUBLE으로 저장됩니다. 64 비트 더블은 -5E-324 ~ +1.7976931348623157E +308의 값을 나타낼 수 있다고 생각합니다.

Endkey가 독점 대신 포괄적 인 기능을 갖춘 기능을 갖는 것이 좋을 것 같습니다.

이것은 트릭을 수행해야합니다.

?startkey=["some_customer_id"]&endkey=["some_customer_id", "\uFFFF"]

여기에는 uffff보다 작은 문자로 시작하는 모든 것이 포함되어야합니다 (모든 유니 코드 문자).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top