我需要执行查询以获取子集合中最老的文档。我希望尽可能少的读取来执行这个查询。德国联邦铁路(DB)描述:基于Firebase。设备集合。每个设备都有一个回调集合。对于一个特定的设备,我需要获取最古老的回调(回调有时间戳)。
我想我知道如何使用设备唯一ID执行此查询,但我想通过过滤设备的某些字段来实现,该字段也是唯一的.我可以用他所有的回调查询设备来做到这一点,但这将收取我比实际需要更多的读取费用。
使用ID:
的查询admin
.firestore()
.collection("devices/{device_id}/callbacks")
.{order_by_timestamp}
.limit(1)
.get()
.then((data) => {
let callbacks = [];
data.forEach((doc) => {
callbacks.push(doc.data());
});
return res.json(callbacks);
})
.catch((err) => console.error(err));
如果设备集合中的字段是唯一的,那么您可以首先获取该设备的ID,然后继续使用现有的逻辑,如下所示:
async function getOldestCallback(thatFieldValue) {
const device = await admin.firestore().collection("devices").where("thatField", "==", thatFieldValue).get()
if (device.empty) return false;
const deviceId = device[0]["id"];
// existing function
}
这将导致2次读取(1用于设备文档,1用于最老的回调,如果它存在)。
此外,由于您将返回的文档数量限制为1,因此您可以使用[0]
而不是使用forEach循环。
const callbacks = [ data[0].data() ]