جافاسكريبت - استعلام Firestore حسب نطاق التاريخ
أحتاج إلى المساعدة لاستعلام مجموعة كبيرة باستخدام نطاق زمني. انظر المستند المثال أدناه. أريد استعلام حقل startTime باستخدام نطاق زمني.
الإجابة رقم 1
نظرًا لأن لدي حقل dueDate مخزّن كـ "timestamp" (وليس كـ string أو number) على 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')
الإجابة رقم 2
يمكنك تخزين كائن التاريخ والوقت كوقت يونكس (الثواني منذ 1 يناير 1970). ثم يمكنك ببساطة استخدام الجملة الشرطية select هكذا:
collectionRef.where("startTime", ">=", "1506816000").where("startTime", "<=", "1507593600")بالمناسبة - لتحويل من datetime إلى وقت يونيكس في تطبيقك، يمكنك استخدام المكتبة الممتازة (والتي أصبحت الآن غير مدعومة) moment (إذا كنت تبني شيئًا باستخدام js أو node).
الإجابة رقم 3
يمكنك الاستعلام باستخدام فئة Timestamp الخاصة بـ Firestore.
انظر المثال التالي:
const startfulldate = admin.firestore.Timestamp.fromDate(
new Date(1556062581000)
);
const snapshot = await db.collection('mycollection')
.where('start_time', '<=', startfulldate)
.get();
الإجابة رقم 4
const event = new Date();
const expirationDate = admin.firestore.Timestamp.fromDate(event);
const query = collectionRef.where('startTime', '<=', expirationDate)
الإجابة رقم 5
نظرًا لأن startTime مخزن كـ Timestamp، يمكنك تنفيذ هذا الاستعلام النطاقي للحصول على دقة أكبر (وهذا جيد لكل من حالة نطاق التاريخ الطويل أو نفس نطاق التاريخ).
const start = new Date('2021-01-01T00:00:00.000z');
const end = new Date('2021-03-01T23:59:59.000z');
db.collection('Data').where('startTime', '>=', start).where('startTime', '<=', end).get().then(data => {
//pass your 'data' here
});
لقد استخدمت هذا في تطبيقاتي على Node.js. آمل أن يكون هذا مفيدًا.

