firestore js множественный заказ, не сортируя результат - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь выполнить запрос, содержащий 2 orderBy, за которыми следует startAt (который применяет фильтр к 1-му orderBy (orderId)):

  let result = await db    // db = firebase.firestore()
    .collection('/orders')
    .where('userId', '==', userId) // userId = 'zHJgWUFL54deq4a...'
    .orderBy('orderId')
    .orderBy('co', 'desc')
    .startAt(filter)      // filter = '2020-01-YND'
    .get()


Коллекция заказов :

// Item 1
{
  "co": 0,
  "userId": "zHJgWUFL54deq4a...",
  "orderId": "2020-01-YNDKALCK"
}

// Item 2
{
  "co": 1,
  "userId": "zHJgWUFL54deq4a...",
  "orderId": "2020-01-YNDSCSAD"
}
  • Созданы составные индексы:
orders      userId Ascending orderId Ascending co Descending    Collection      Enabled


RESULT : результат не отсортирован (по убыванию) по co .

// Item 1
{
  "co": 0,
  "userId": "zHJgWUFL54deq4a...",
  "orderId": "2020-01-YNDKALCK"
}

// Item 2
{
  "co": 1,
  "userId": "zHJgWUFL54deq4a...",
  "orderId": "2020-01-YNDSCSAD"
}

Instead of Item 2 first then Item 1

Я создал проблему в github firestore и обновлю ее тут и там, когда получу ответ.

Спасибо

--------------------------------------- --------------

Обновление:

К сожалению, проблема с переключением порядка из-за отсутствия результата ... Я уже создал составной индекс. фильтр используется для «поиска» orderId (поиск текста, а не полнотекстовый поиск, поскольку он не поддерживается).

Таким образом, эти 2 запроса возвращают []:

// changed orderBy order
 let result = await db    // db = firebase.firestore()
    .collection('/orders')
    .where('userId', '==', userId) // userId = 'zHJgWUFL54deq4a...'
    .orderBy('co', 'desc')
    .orderBy('orderId')
    .startAt(filter)      // filter = '2020-01-YND'
    .get()

and: 

// added endAt
 let result = await db    // db = firebase.firestore()
    .collection('/orders')
    .where('userId', '==', userId) // userId = 'zHJgWUFL54deq4a...'
    .orderBy('co', 'desc')
    .orderBy('orderId')
    .startAt(filter)      // filter = '2020-01-YND'
    .endAt(filter + '\uf8ff')
    .get()

Но если я удалить orderBy ('co', 'des c'), я получил результаты, но все еще не то, что я ищу:

 let result = await db    // db = firebase.firestore()
    .collection('/orders')
    .where('userId', '==', userId) // userId = 'zHJgWUFL54deq4a...'
    .orderBy('orderId')
    .startAt(filter)      // filter = '2020-01-YND'
    .endAt(filter + '\uf8ff')
    .get()

returns:
// Item 1
{
  "co": 0,
  "userId": "zHJgWUFL54deq4a...",
  "orderId": "2020-01-YNDKALCK"
}

// Item 2
{
  "co": 1,
  "userId": "zHJgWUFL54deq4a...",
  "orderId": "2020-01-YNDSCSAD"
}

Ответы [ 2 ]

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

Если я правильно понял ваш вопрос, думаю, вы, вероятно, не заметили, что при заказе по нескольким полям документы упорядочиваются в порядке orderBy() s в цепочке методов.

Как объяснено в do c:

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

  let byStateByPop = citiesRef.orderBy('state').orderBy('population', 'desc');

Другими словами, в вашем случае результаты сначала упорядочиваются по orderId а затем в каждом orderId они упорядочены по co.


Итак, ваш результат ниже верен, поскольку 2020-01-YNDKALCK предшествует 2020-01-YNDSCSAD:

// Item 1
{
  "co": 0,
  "userId": "zHJgWUFL54deq4a...",
  "orderId": "2020-01-YNDKALCK"
}

// Item 2
{
  "co": 1,
  "userId": "zHJgWUFL54deq4a...",
  "orderId": "2020-01-YNDSCSAD"
}

Вы должны попробовать использовать записи с одинаковым значением orderId.

Если вы хотите, чтобы результаты сначала были упорядочены по co, просто поменяйте местами orderBy() ( и создайте новый индекс).

0 голосов
/ 17 февраля 2020

В итоге я использовал ElasticSearch, мне нужно было FTS и больше агрегатов, которые Firestore может обработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...