Запрос Firestore по дате

Мне нужна помощь для запроса длинной коллекции с диапазоном дат. См. Нижеприведенный пример документа. Я хочу запросить поле startTime, используя диапазон дат.

enter image description here

enter image description here

Ответ 1

Поскольку у меня есть поле "dueDate", которое хранится как timestamp (и NOT как строка или номер) в облачном firestore, я сделал это, чтобы получить документы-фактуры с установленной датой в 2017 году:

        let start = new Date('2017-01-01');
        let end = new Date('2018-01-01');

        this.afs.collection('invoices', ref => ref
            .where('dueDate', '>', start)
            .where('dueDate', '<', end)
        );

ПРИМЕЧАНИЕ. Поле dueDate хранилось в firebase с объектом Date(). например: this.doc.dueDate = new Date('2017-12-25')

Ответ 2

Вы можете сохранить объект datetime как Unix time (секунды с 1 января 1970 года). Тогда вы можете просто использовать, где выбрать, как это:

collectionRef.where("startTime", ">=", "1506816000").where("startTime", "<=", "1507593600")

Btw - конвертировать из datetime в Unix время в вашем приложении, вы можете использовать отличный момент библиотеки (если вы строите что-то с js или узлом).

Ответ 3

Решением является использование Date.now(), прекращение использования службы timestamp из firebase, вам нужно работать с числовым значением времени в миллисекундах, например, например: 1514271367000, вместо этого, если firestore использует 26/12/2017 1:56: 07 GMT- 0500 (-05) не будет работать. Пример запроса:

    this.fsService.afs.collection('chats/4bY1ZpOr1TPq8bFQ3bjS/finance/123+finance/12345'
      , ref => ref.orderBy('hour').startAt(1514184967000).endAt(1514271367000))
      .valueChanges().subscribe(data =>{
        this.mensajes = data;
      })

Ответ 4

Для всех, кто недавно пользовался фирменным пожарным магазином. Существует различие в зависимости от ваших настроек имплантации. (Или в зависимости от версии Firebase)

Раньше firestore сохранял временную метку в качестве данных, однако, как описано здесь, в документах вскоре будет заменен объект Timestamp. Смотрите документацию Timestamp здесь.

Вы можете принудительно реализовать свою реализацию, добавив в свой код параметр, заставляющий firebase использовать объекты Timestamp вместо Date.

   var firebaseApp = firebase.initializeApp({
        apiKey: [APIKEY],
        authDomain: [FIREBASEAPPDOMAIN],
        projectId: [PROJECTID]
   });

   var firestore = firebase.firestore();
   var settings = { timestampsInSnapshots: true }; // force Timestamp object instead of Date
   firestore.settings(settings);

Ответ 5

В веб-приложении именно таким образом можно использовать временные метки и даты Firebase для запросов и хранения документов.

Firestore date usage

Ответ 6

var startfulldate = admin.firestore.Timestamp.fromDate(new Date(1556062581000));
db.collection('mycollection')
  .where('start_time', '<=', startfulldate)
  .get()
  .then(snapshot => {              
        var jsonvalue: any[] = [];
        snapshot.forEach(docs => {
          jsonvalue.push(docs.data())
           })
             res.send(jsonvalue);
             return;
            }).catch( error => {
                res.status(500).send(error)
            });