Второй запрос orderBy ничего не делает в Firestore (response-native-firebase) - PullRequest
0 голосов
/ 26 июня 2018

РЕДАКТИРОВАТЬ Таким образом, после рассмотрения этой проблемы с разработчиком Firebase это работает по проекту, и нет никакого реального способа добиться этого.Официальный ответ от firestore dev:

По общему признанию, некоторые виды запросов являются трудными, если не осуществимыми, при работе с NoSQL-проектом Firestore.Если отсутствие таких возможностей считается преградой для вашего варианта использования, то, скорее всего, Firestore может оказаться не лучшим решением для вас.

Если вы отчаянно хотите чего-то достичьпохоже, тогда, возможно, это решение будет работать для вас: https://firebase.google.com/docs/firestore/solutions/arrays#solution_a_map_of_values.

Если не всегда есть AWS

==========================================================================

Я замечаю, что второй параметр запроса orderBy не влияет на возвращаемые данные.Рассмотрим следующий запрос:

firebase.firestore()
  .collection('posts')
  .orderBy('date', 'desc')
  .where('date', '>', new Date(1529802276644))
  .orderBy('rating', 'desc')
  .limit(size)

Этот запрос намеревается упорядочить posts по полю date, затем отфильтровать его за последние два дня, затем упорядочить их по rating.

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

[
  {date: 3 hours ago, rating: 1},
  {date: 5 hours ago, rating: -1},
  {date: 9 hours ago, rating: 0},
]

И если я выполняю тот же запрос с последним удаленным заказом, я на самом деле получаю точно такие же результаты:

firebase.firestore()
  .collection('posts')
  .orderBy('date', 'desc')
  .where('date', '>', new Date(1529802276644))
  .limit(size)

производит:

[
  {date: 3 hours ago, rating: 1},
  {date: 5 hours ago, rating: -1},
  {date: 9 hours ago, rating: 0},
]

В настоящее время у меня включен индекс по сообщениям.Я вполне уверен, что индекс правильный, потому что раньше я получал сообщение об отсутствующем индексе, а затем исправлял его с помощью этого индекса:

posts |  date DESC rating DESC   |    enabled

Я почти уверен, что проблема связана с firebase ине с библиотекой, которую я использую response-native-firebase.Используемый мной Firebase Firestore SDK включен 5.0.4. Я полагаю,

EDIT Вот как я на самом деле использую код в своем реактивном проекте:

const episodeRef = firebase.firestore().collection('posts');
const baseRequest = episodeRef.orderBy('date', 'desc').where('date', '>', new Date(1529802276644)).orderBy('rating', 'desc').limit(25)
const documentSnapshots = await baseRequest.get()
console.log('documentSnapshots', documentSnapshots);

Console.log выводит действительный querysnapshot, и поле _query выглядит примерно так:

_fieldFilters:{
    fieldPath:{
        string:"date",
        type:"string"
    },
    operator:"GREATER_THAN",
    value:{
        type:"date",
        value:1529802276644
    },
}
_fieldOrders:{
    0:{
        direction:"DESCENDING",
        fieldPath: {
            string:"date",
            type:"string"
        },
    }
    1:{
        direction:"DESCENDING"
        fieldPath:{
            string:"rating",
            type:"string"
        }
    }
}

(плохая печать из-за копирования)

1 Ответ

0 голосов
/ 26 июня 2018

Я не уверен, что это является причиной, но в базе данных Firebase Realtime это распространенная ошибка, поэтому здесь тоже стоит короткое объяснение.

Когда вы конвертируете QuerySnapshot documentSnapshots в строку, она теряет любую информацию о порядке данных.

Вместо этого переберите результаты с помощью QuerySnapshot.forEach(), чтобы убедиться, что вы поддерживаете порядок, в котором запрашивали данные:

const documentSnapshots = await baseRequest.get()
documentSnapshots.forEach(document => {
  console.log('document', document);
});

Если это работает, это, вероятно, также работает:

const documentSnapshots = await baseRequest.get()
console.log('document', documentSnapshots.docs());
...