جافاسكريبت - استعلام 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. آمل أن يكون هذا مفيدًا.