Firestore에서 where에서 하고 있는 필드와 orderby하고 싶은 필드가 다르기 때문에 복합 인덱스를 만든다
나는 포인트 가치를 다루는 앱을 자주 씁니다. 밸류 조작 자체는 트랜잭션 처리도 가능하므로 Firestore에서도 안심하고 처리할 수 있습니다. 그래서, 처리시에 transactions 컬렉션에 아래와 같은 스키마의 document를 처리할 때마다 남긴다고 합니다.
처리한 시간과, 어떠한 처리를 했는지를 기록한다고 합니다.
{
createdAt: 2019-10-13 09:14:11
operation: "SEND" // or "Receive"
}
문제없는 케이스
전체 로그를 내림차순으로보고 싶다면,
db.collection('transactions')
.orderby('createdAt','desc').get();
라고 됩니다. SQL로 쓰면, 아래와 같은 느낌이 됩니다만,
select * from transactions order by createdAt desc;
이 처리는 특별히 문제가 없습니다.
문제(또는 조작이 필요)가 되는 케이스
다만, SEND 처리만을 조작 시간으로 소트 하고 싶은 경우, (아무것도 하지 않으면) 에러가 됩니다.
db.collection('transactions')
.where('operation','==','SEND')
.orderby('createdAt','desc').get();
SQL로 작성하면,
select * from transactions where operation = 'SEND' order by craetedAt desc;
라는 아무런 변철도 없는 쿼리입니다.
오류의 원인은 where 조건에서 사용하는 operation과 orderby에서 다른 필드를 사용하기 때문입니다.
이 쿼리를 실행하면 다음과 같은 오류가 발생합니다.
{ Error: 9 FAILED_PRECONDITION: The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/xxxxx/firestore/indexes?create_composite=ClNwcm9qZWN0cy9jd3NlcnZlci02Y2ZiMy9kYXRhYmFzZXMvKGRlZmF1bHQpL2NvbGxlY3Rpb25Hcm91cHMvdHJhbnNhY3Rpb25zL2luZGV4ZXMvXxABGg0KCW9wZXJhdGlvbhABGg0KCWNyZWF0ZWRBdBACGgwKCF9fbmFtZV9fEAI
at callErrorFromStatus (/Users/xxxx/fire_test/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
at Http2CallStream.call.on (/Users/xxxx/fire_test/node_modules/@grpc/grpc-js/build/src/call.js:79:34)
at Http2CallStream.emit (events.js:203:15)
at process.nextTick (/Users/xxxx/fire_test/node_modules/@grpc/grpc-js/build/src/call-stream.js:75:22)
at process._tickCallback (internal/process/next_tick.js:61:11)
자주 읽으면 "이 쿼리에는 index가 있습니다. 아래 URL로 가면 만들 수 있습니다"라고 친절하게 써주고 있습니다.
링크의 URL에 가면, 그대로 「만들까?」라고 (들)물어 오므로 「만들다」라고 하면 좋은 것 같습니다.
아래와 같이 적절한 index를 만들어주는 것 같습니다.
작성한 후 오류가 발생한 쿼리를 실행하면 문제없이 쿼리가 실행됩니다.
Reference
이 문제에 관하여(Firestore에서 where에서 하고 있는 필드와 orderby하고 싶은 필드가 다르기 때문에 복합 인덱스를 만든다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/zaburo/items/1905499ceab8c1420593텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)