Я хочу сохранить упорядоченный список путей к изображениям в документе Firestore.Изображения загружаются в хранилище с метаданными, содержащими позицию и тег, связывающий документ.Количество ожидаемых изображений известно.Загрузка изображений осуществляется практически одновременно.
Правильно, я делаю это, сохраняя список путей к изображениям в виде массива.Вкратце: изображение загружается, с помощью транзакции читается документ, массив изменяется и снова сохраняется.Транзакция никогда не завершается неудачей, но иногда элемент массива снова исчезает после загрузки другого изображения.
У меня два вопроса: является ли массив лучшей структурой в базе данных NoSql для этой проблемы?Почему элемент массива исчезает несмотря на транзакцию?
export const addImageToTag = functions.storage.object().onFinalize(async (object) => {
try {
const tag = object.metadata.Tag;
const position = object.metadata.Position;
const tagRef = db.collection(COLLECTION_TAGS).doc(tag)
const tagSnapshot = await db.runTransaction(t => t.get(tagRef));
const images = tagSnapshot.data().images;
images[position] = object.name;
let uploadCount = 0;
for (let i = 0; i < tagSnapshot.data().imageCount; i++) {
if (images[i].length > 0) {
uploadCount++;
} else {
break;
}
}
let state;
if (tagSnapshot.data().imageCount === uploadCount) {
state = STATE_ACTIVE;
} else {
state = STATE_UPLOADING;
}
await tagSnapshot.ref.update({
images: images,
state: state
});
console.log('Image ', position, ' of tag ', tag, 'added')
} catch (error) {
console.error('Call failed: ', error)
}
});