Заявление OrderBy для подполей в Firebase в Flutter - PullRequest
0 голосов
/ 14 января 2020

У меня есть коллекция следующих элементов:

firebase

Я хочу вернуть каждую компанию в порядке возрастания на companyName, и вот как я m пытаюсь;

QuerySnapshot usersComp = await _firestore
        .collection('companies')
        .where('belongsTo', isEqualTo: curruser.uid)
        .orderBy({
      'properties': {'companyName'}
    }, descending: false).getDocuments();

Код не выдает никаких ошибок, но также не возвращает никакого значения. Оператор без orderBy работает нормально.

Как я могу написать это orderBy в рабочем режиме?

edit

Это целая функция getCompanies в FirebaseCrud:

Future<List<Company>> getCompanies() async {
    FirebaseUser curruser = await _authService.getCurrentUser();

    DocumentSnapshot userSnapshot = await Firestore.instance
        .collection('users')
        .document(curruser.uid)
        .get();

    List partners = userSnapshot.data['partners'];
    print('partners');
    print(partners[0]);

    QuerySnapshot usersComp = await _firestore
        .collection('companies')
        .where('belongsTo', isEqualTo: curruser.uid)
        //.orderBy('properties.companyName', descending: false) // code works fine without this line but not as expected
        .getDocuments();

    List<Company> companies = new List<Company>();

    usersComp.documents.forEach((f) {
      int indexOfthis = usersComp.documents.indexOf(f);

      companies.add(new Company(
        uid: partners[indexOfthis],
        companyName: f.data['properties']['companyName'],
        address: f.data['properties']['address'],
        paymentBalance: f.data['currentPaymentBalance'],
        revenueBalance: f.data['currentRevenueBalance'],
        personOne: new Person(
            phoneNumber: f.data['properties']['personOne']['phoneNumber'],
            nameAndSurname: f.data['properties']['personOne']
                ['nameAndSurname']),
        personTwo: new Person(
            phoneNumber: f.data['properties']['personTwo']['phoneNumber'],
            nameAndSurname: f.data['properties']['personTwo']
                ['nameAndSurname']),
      ));
    });

    return companies;
  }

Ответы [ 2 ]

1 голос
/ 15 января 2020

Я создал коллекцию с несколькими документами, каждый из которых имеет поле верхнего уровня и вложенное поле. Если я затем выполню запрос к нему следующим образом:

Firestore.instance.collection("59739861")
    .where("location", isEqualTo: "Bay Area")
    .orderBy("properties.companyName", descending: false)
    .getDocuments().then((querySnapshot) {
      print("Got ${querySnapshot.documents.length} documents");
      querySnapshot.documents.forEach((doc) {
        print("${doc.documentID}: ${doc.data['properties']}");
      });
    });

Я добавлю эти три документа в свою базу данных:

  • location: "Bay Area", properties.companyName: "Google"
  • расположение: "Bay Area", properties.companyName: "Facebook"
  • местоположение: "Seattle", properties.companyName: "Microsoft"

С помощью вышеуказанного запроса я получаю следующий вывод:

флаттер: KJDLLam4xvCJEyc7Gmnh: {companyName: Facebook}

флаттер: TMmrOiKTYQWFBmJpughg: {companyName: Google}

1020 *

Понятия не имею, почему вы получаете разные результаты.

На всякий случай важно запустить приложение в симуляторе iOS и использовать эту версию плагина Firestore:

cloud_firestore: ^0.13.0+1
1 голос
/ 14 января 2020

Использование точечной нотации для ссылки на свойства объектов, используемых для сортировки.

_firestore
    .collection('companies')
    .where('belongsTo', isEqualTo: curruser.uid)
    .orderBy('properties.companyName'),
    descending: false)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...