Faunadb как мне разбить на страницы индекс, отсортированный по метке времени

#pagination #facebook-fql #faunadb

#разбивка на страницы #facebook-fql #faunadb

Вопрос:

Я создал индекс в faunadb для сортировки по метке времени, чтобы сначала получить самые последние элементы, и я пытаюсь получить 100 элементов за раз. Моя проблема в том, что когда я ввожу параметр «после» из результата, я получаю те же результаты, что и первоначальный запрос.

Это индекс, который я создал:

 CreateIndex({
  name: "all_school_queries",
  source: Collection('<school_queries_reversed>'),
  values:   values: [
     {
       field: ["ts", {reverse: true}]
     },
     {
       field: ["ref"]
     }
  ]
})
  

Вот как я запрашиваю базу данных:

     Map(
      Paginate(Match(Index("school_query_reverse")), {
        after: [ Ref(Collection("collection_name") ,'collection ref from first query')],
      }),
    
      Lambda(
        ['ts',"ref"], 
        Get(Var("ref"))
      ) 
    )
  

и это первый результат:

 {
  before: [Ref(Collection("collection_name"), "275484304279077376")],
  after: [
    1598907150720000,
    Ref(Collection("school_queries"), "12345"),
    Ref(Collection("school_queries"), "12345")
  ],
}
  

Я использовал как временную метку для after, 1598907150720000 так и для ref, 12345 . Сначала я попробовал консоль, чтобы убедиться, что смогу получить правильный ответ, но после ввода любого результата из after я получаю тот же результат.

Комментарии:

1. Можете ли вы попробовать без параметра after, чтобы убедиться, что индекс выглядит правильно?

Ответ №1:

Я попытаюсь ответить на ваш вопрос (я разработчик adv в FaunaDB). Я должен сказать, что я совершенно сбит с толку вашим вопросом из-за синтаксиса, который, похоже, не имеет смысла для меня, поэтому я прошу прощения, если это не тот ответ, который вы ищете.

Вещи, которые меня смущают.

  • Синтаксис индекса неверен, вы скопировали это где-нибудь или переписали вручную? Если вы его куда-то скопировали, мы можем отобразить его неправильно, поэтому дайте мне знать, если это так. Имя индекса не соответствует имени, которое вы используете, поэтому я предполагаю, что это опечатка.
  • <school_queries_reversed>, обратный в названии коллекции, похоже, не имеет смысла для меня, поскольку обратный определен в индексе, а не в коллекции.

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

Индекс, который я использовал, выглядит следующим образом:

 CreateIndex({
   name: "all_school_queries",
    source: Collection('school_queries'),
    values: [
     {
       field: ["ts"], 
       reverse: true
     },
     {
       field: ["ref"]
     }
  ]
})
  

Если я затем запрошу этот индекс следующим образом:

 Map(
  Paginate(Match(Index("all_school_queries")), {size: 1}),   
  Lambda(
     ['ts',"ref"], 
     Get(Var("ref"))
  )
)
  

Я получаю последний элемент, который я добавил первым (обратный индекс)

 {
  after: [
    1599220462170000,
    Ref(Collection("school_queries"), "275735235372515847"),
    Ref(Collection("school_queries"), "275735235372515847")
  ],
  data: [
    {
      ref: Ref(Collection("school_queries"), "275735244842205703"),
      ts: 1599220471200000,
      data: {
        query: "bli"
      }
    }
  ]
}
  

и когда я использую возвращенный курсор after для получения следующей страницы (здесь я указал страницы только из одного элемента):

 Map(
      Paginate(Match(Index("all_school_queries")), {size: 1, after: [
        1599220462170000,
        Ref(Collection("school_queries"), "275735235372515847"),
        Ref(Collection("school_queries"), "275735235372515847")
      ]}),
    
      Lambda(
        ['ts',"ref"], 
        Get(Var("ref"))
      )
)

  

Я получаю (как и ожидалось) другой элемент.

 
{
  before: [
    1599220462170000,
    Ref(Collection("school_queries"), "275735235372515847"),
    Ref(Collection("school_queries"), "275735235372515847")
  ],
  data: [
    {
      ref: Ref(Collection("school_queries"), "275735235372515847"),
      ts: 1599220462170000,
      data: {
        query: "bla"
      }
    }
  ]
}
  

У вас это не работает?

Ответ №2:

У меня была такая же проблема, и я создал сообщение на форуме о том, как с этим справиться.

https://forums .fauna.com/t/filter-by-timestamp-with-gql-resolver/3302

Я думаю, что большинство людей отсутствуют

  • paginated: true в схеме gql или
  • Map(Var("page"), Lambda(["ts", "ref"], Get(Var("ref")))) передать [«ts», «ref»] в лямбда-выражение после разбивки на страницы