Мені потрібна допомога для запиту довгої колекції з діапазоном дат. Див. Приклад документа нижче. Я хочу запитати поле startTime, використовуючи діапазон дат.
Відповіді:
Оскільки я dueDate
зберігаю поле як "мітку часу" (а НЕ як рядок чи номер ) у Cloud 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')
.where('team_id', '==', teamId).where('time', '>=', start).where('time', '<=', end)
Ви можете зберегти об'єкт datetime як час Unix (секунди з 1 січня 1970 року). Тоді ви можете просто використати де виберіть так:
collectionRef.where("startTime", ">=", "1506816000").where("startTime", "<=", "1507593600")
До речі - для перетворення дати та часу в Unix у вашому додатку ви можете використовувати чудовий момент бібліотеки (якщо ви щось будуєте за допомогою js або node).
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)
});
const event = new Date();
const expirationDate = admin.firestore.Timestamp.fromDate(event);
const query = collectionRef.where('startTime', '<=', expirationDate)
Для всіх, хто нещодавно використовував Firebase Firestore, існує різниця залежно від ваших налаштувань реалізації Firebase (залежно від версії Firebase).
Раніше Firestore зберігав Timestamp
як Date
, проте, як описано тут у документах, незабаром його замінить 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 instead of Date
firestore.settings(settings);
Ті, хто, як і я, використовує PHP для доступу до Firestore, можуть зробити щось подібне:
$startTime = new DateTime('2020-05-23 00:00:00');
$endTime = new DateTime('2020-06-23 23:59:59');
$start = new Google\Cloud\Core\Timestamp($startTime);
$end = new Google\Cloud\Core\Timestamp($endTime);
// fb is a Google\Cloud\Firestore\FirestoreClient object
$this->query = $this->fb->collection('your_collection');
$aux = $this->query;
$aux = $aux->where('startTime', '<', $end);
$aux = $aux->where('startTime', '>', $start);
return $aux->documents();
Насолоджуйтесь
Рішення полягає у використанні Date.now (). Припиніть використовувати службу міток часу з 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;
})
У програмі інтерфейсу це те, як мітки часу та дати Firebase можуть використовуватися для запитів та зберігання документів.
Загальна функція пошуку документів у колекції за діапазоном дат конкретних полів:
public List<QueryDocumentSnapshot> findDocsByDateRange(String collection,
String fieldStartDate,
String fieldEndDate,
Date startDate,
Date endDate) {
ApiFuture<QuerySnapshot> querySnapshot = fireStore()
.collection(collection)
.whereGreaterThanOrEqualTo(FieldPath.of(fieldStartDate), startDate)
.whereLessThanOrEqualTo(FieldPath.of(fieldEndDate), endDate)
.get();
return querySnapshot.get().getDocuments();
}
Пакети:
import com.google.api.core.ApiFuture;
import com.google.cloud.firestore.DocumentSnapshot;
import com.google.cloud.firestore.FieldPath;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.QueryDocumentSnapshot;
import com.google.cloud.firestore.QuerySnapshot;