【问题标题】:How to check two queries and then show the result?如何检查两个查询然后显示结果?
【发布时间】:2021-09-09 08:00:30
【问题描述】:

我正在从 firebase 获取数据并且该部分工作正常,但是当我提出两个不同的查询时,它会显示以下错误并要求我在 firestore 中创建索引,但索引已经存在。如果我尝试只使用一个查询来获取数据,那么它工作正常,无论是哪个查询,它都会相应地显示结果。我想同时检查两个查询,然后显示结果。

错误:-

W/Firestore(30122): (23.0.0) [Firestore]: Listen for Query(target=Query(users where isOnline == # com.google.firestore.v1.Value@8bb4a
W/Firestore(30122): boolean_value: true
W/Firestore(30122): integer_value: 0 and age >= # com.google.firestore.v1.Value@90282
W/Firestore(30122): integer_value: 0
W/Firestore(30122): string_value: "18" and age <= # com.google.firestore.v1.Value@91a86
W/Firestore(30122): integer_value: 0
W/Firestore(30122): string_value: "50" order by age, __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/practiceflutter-692db/firestore/indexes?create_composite=ClNwcm9qZWN0cy9wcmFjdGljZWZsdXR0ZXItNjkyZGIvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL3VzZXJzL2luZGV4ZXMvXxABGgwKCGlzT25saW5lEAEaBwoDYWdlEAEaDAoIX19uYW1lX18QAQ, cause=null}
E/flutter (30122): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: [cloud_firestore/failed-precondition] The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/practiceflutter-692db/firestore/indexes?create_composite=ClNwcm9qZWN0cy9wcmFjdGljZWZsdXR0ZXItNjkyZGIvZGF0YWJhc2VzLyhkZWZhdWx0KS9jb2xsZWN0aW9uR3JvdXBzL3VzZXJzL2luZGV4ZXMvXxABGgwKCGlzT25saW5lEAEaBwoDYWdlEAEaDAoIX19uYW1lX18QAQ
E/flutter (30122): #0      MethodChannelQuery.get (package:cloud_firestore_platform_interface/src/method_channel/method_channel_query.dart:108:7)
E/flutter (30122): <asynchronous suspension>
E/flutter (30122): #1      Query.get (package:cloud_firestore/src/query.dart:177:9)
E/flutter (30122): <asynchronous suspension>
E/flutter (30122): 

如果我删除 .where('isOnline',isEqualTo: true) 那么它工作正常或只检查 .where('isOnline',isEqualTo: true) 然后它也相应地显示结果。我希望它检查两者然后继续。我正在尝试的查询是:-

query() {

    if (currentUser.showGender == 'everyone') {
      return _reference.where('isOnline',isEqualTo: true)
          .where('age',
        isGreaterThanOrEqualTo: currentUser.ageRange['min'],
      )
          .where('age',
          isLessThanOrEqualTo:currentUser.ageRange['max'])
          .orderBy('age', descending: false).limit(docLimit);
    } else {
      return _reference.where('isOnline',isEqualTo: true)
          .where('editInfo.userGender', isEqualTo: currentUser.showGender)
          .where('age',
        isGreaterThanOrEqualTo:currentUser.ageRange['min'],
      )
          .where('age',
          isLessThanOrEqualTo: currentUser.ageRange['max'])
          .orderBy('age', descending: false).limit(docLimit);
    }
  }

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    正如错误所说,您需要和索引。该错误还提供了执行此操作的直接 URL。

    https://console.firebase.google.com/v1/r/project/practiceflutter-692db/firestore/indexes?create_composite=

    请按照网址创建相关索引。

    【讨论】:

    • 但是索引已经存在,如果我只检查一个查询,那么就没有这样的错误。
    • @GAGANSINGH 你能分享一下你已经拥有的索引的截图吗?
    • @GAGANSINGH 你能按照我更新的答案创建一个索引吗?
    • 我删除了 isOnline 旧索引,然后尝试像你说的那样创建,但后来我收到错误 => 索引已经存在。
    • 我需要删除所有索引,然后像你说的那样创建一个吗?因为我也在其他屏幕中使用 userGender 索引。希望它不会影响它已经正常工作的地方。
    猜你喜欢
    • 2017-08-11
    • 2012-12-26
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多