Моя модель данных Firestore выглядит следующим образом
Организации / {orgId} / cloudAccounts / {cloudAccountId} / resources / {resourceId}
Я выполняю простую запрос вроде этого
let documents = await db.collection("Organizations")
.doc("orgIdabc")
.collection("cloudAccounts")
.doc("cloudAccountIdabc")
.collection("resources")
.get();
console.log("LENGTH: ", documents.docs.length);
Теперь проблема в том, что когда я пытаюсь записать длину документа, он всегда дает мне другую длину. Я поделюсь выводом также.
LENGTH: 18
LENGTH: 19
LENGTH: 19
LENGTH: 6
LENGTH: 3
LENGTH: 19
LENGTH: 12
LENGTH: 19
LENGTH: 19
Теперь фактическая длина равна 19, но, как вы видите, я получаю разные длины. Я не знаю, в чем здесь проблема, любая помощь будет очень признательна.
Обновлено в соответствии с запросом. Я добавляю полный фрагмент кода. Также я узнал, что эта проблема возникает только в Admin SDK, а не в клиентском SDK
const { db } = require("./firestore");
const functions = require("firebase-functions");
exports.runScanOnAllCloudAccounts = functions.https.onRequest((req, res) => {
runScanOnAllCA();
return res.status(200);
});
async function runScanOnAllCA() {
try {
for (let i = 0; i < 10; i++) {
let documents = await db.collection("Organizations")
.doc("orgIdabc")
.collection("cloudAccounts")
.doc("cloudAccountIdabc")
.collection("resources")
.get();
console.log("LENGTH: ", documents.docs.length);
}
} catch (err) {
console.log("err: ", err);
}
}
Обновление 02 ===========> Я обновил код для использования интенсивного подхода Promise (), как рекомендовано некоторыми пользователями, и я по-прежнему получаю документы различной длины. Я чувствую, что люди здесь упускают суть. Обещания - это просто способ запуска асинхронного кода, мы можем решить эту проблему, используя asyn c await, который уже использовался в предыдущей версии кода. Тем не менее следующий фрагмент кода не решает проблему.
const { db } = require("./firestore");
const functions = require("firebase-functions");
exports.runScanOnAllCloudAccounts = functions.https.onRequest(
async (req, res) => {
runScanOnAllCA(res)
.then(resolve => {
console.log(resolve);
})
.catch(err => {
console.log(err);
});
// return res.status(200);
}
);
async function runScanOnAllCA(res) {
return new Promise(async (resolve, reject) => {
db.collection("Organizations")
.doc("sumair-hello-world_axtr8")
.collection("cloudAccounts")
.doc("4ZQgjt94pvEQTlvxSJ75")
.collection("resources")
.get()
.then(querySnapshot => {
resolve(querySnapshot.docs.length);
})
.catch(err => {
reject(err);
});
});
}