Firestore에서 where에서 하고 있는 필드와 orderby하고 싶은 필드가 다르기 때문에 복합 인덱스를 만든다

4578 단어 FirebaseFirestore
Firestore에는 다양한 제한이 있다. 그래도 편리하기 때문에 여러가지 시험한다.

나는 포인트 가치를 다루는 앱을 자주 씁니다. 밸류 조작 자체는 트랜잭션 처리도 가능하므로 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를 만들어주는 것 같습니다.



작성한 후 오류가 발생한 쿼리를 실행하면 문제없이 쿼리가 실행됩니다.

좋은 웹페이지 즐겨찾기