首页 > 解决方案 > 如果时间戳是通过日期或未来日期,如何在 firebase 中订购和分离文档?

问题描述

我正在构建一个计数应用程序,我想按降序显示负计数器,但按升序显示正计数器。

目前,我只知道如何做其中任何一个,但不知道我应该在哪里编辑我的代码以添加 if/else 以输出不同的订单。

这是当前渲染的输出:

在此处输入图像描述

但目标是负数计数器应该是下降的,所以在这个例子中,“下一杯咖啡”应该是第一个,然后是“下一顿饭”,另一边应该保持上升。

这是我当前的代码:

db.collection('counters').orderBy("timestamp", "desc").onSnapshot(snapshot => {setInterval(() => 
counters(snapshot.docs), 1000);});

这是呈现计数器的原因:

function renderCounter(doc){

    const data = doc.data();
    const date = data.timestamp.toDate();
    
    let box = document.createElement('div'); box.classList.add('counter');  
    let header = document.createElement('div'); header.classList.add('keydata'); header.setAttribute('data-id', doc.id);    
    let cross = document.createElement('h5'); cross.classList.add('data'); cross.textContent = "x";

    let timestamp = document.createElement('h5'); timestamp.textContent = dateFormat(date);
    let sign = ''; if (date - new Date > 0) {sign = "-"} else if (date - new Date < 0) {sign = "+"};
    let activeCount = document.createElement('h4'); activeCount.textContent = "T" + sign + " " + countThis(date);
    let title = document.createElement('p'); title.classList.add('micro'); title.textContent = data.title;  

    box.appendChild(header);
    header.appendChild(timestamp);
    header.appendChild(cross);
    box.appendChild(activeCount);
    box.appendChild(title);

    if (date - new Date > 0 ) {     
        counterModuleN.appendChild(box);
    }

    else if (date - new Date < 0) {
        counterModuleP.appendChild(box);
    }
    
    cross.addEventListener('click', (e) => {
        e.stopPropagation();
        let id = e.target.parentElement.getAttribute('data-id');
        db.collection('counters').doc(id).delete();
    });
}

有没有办法按不同的顺序对条件数据进行排序?

标签: javascriptfirebasegoogle-cloud-firestore

解决方案


要构建这样的动态查询,它有助于意识到每次调用whereorderBy类似时,您都会返回一个新的查询对象。

所以这样的事情应该有效:

var query = db.collection('counters');
var now = Date.now();
if(date - now > 0){
  query = query.orderBy("timestamp");
}
else if(date - now < 0){
  query = query.orderBy("timestamp", "desc");
}
query.onSnapshot(snapshot => {
  counters(snapshot.docs);
});

如果需要,您可以将条件稍微缩短为:

query = query.orderBy("timestamp", (date - now) > 0 ? "asc" : "desc");

推荐阅读