javascript - 如果时间戳是通过日期或未来日期,如何在 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();
});
}
有没有办法按不同的顺序对条件数据进行排序?
解决方案
要构建这样的动态查询,它有助于意识到每次调用where
或orderBy
类似时,您都会返回一个新的查询对象。
所以这样的事情应该有效:
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");