169 похожих чатов

Добрый день, коллеги. Подскажите пожалуйста не будет ли конфликта

при обновлении документа firestore, если он будет иметь такую структуру:

{
item1: {...},
item2:{...},
item3:{...},
...
item1000:{...}
}

Это таблица, пользователи могут видеть её целиком или частично. Также каждый элемент может редактироваться, причем разные элементы могут редактировать одновременно много пользователей (в системе будет работать порядка 20-30 человек одновременно). Один и тот элемент редактироваться одновременно несколькими людьми не будет.

Обновление данных происходит вот так:
await updateDoc(docRef, { [data?.id]: data });

37 ответов

75 просмотров

Будут конфликты. Будут проблемы с индеком. Будут проблемы с размером документа.

Максим- Автор вопроса

С размером проблем не будет, он гарантировано будет меньше того что в лимитах, это учтено. Что за проблемы с индексами?

Меньше 1 Mb?

Максим- Автор вопроса
Arthur G
Меньше 1 Mb?

да, есть ограничение в 0.8мб, потом создаётся новый документ

Максим
С размером проблем не будет, он гарантировано буде...

По умолчанию, для каждого поля строится индекс.

Максим- Автор вопроса
Максим
так, а проблема в чём может быть?

Для одного поля это можно отключить. Для больше 1 полей уже сложнее.

Максим
С размером проблем не будет, он гарантировано буде...

В целом, аккумулировать данные можно, если они фиксированного размера в одном поле и устраивает скорость записи 1/сек.

Максим- Автор вопроса
Arthur G
В целом, аккумулировать данные можно, если они фик...

На документ целиком ограничение записи 1/сек или на отдельный елемент в нём, как в моём случае это строка таблицы?

Максим
На документ целиком ограничение записи 1/сек или н...

Это ограничение можно обойти, но это не так просто и тоже есть ограничения.

Максим- Автор вопроса
Arthur G
На документ.

Я сделал тестовую функцию, которая просто делает 30 запросов практически одновременно. Так вот, в базу они все записываются

Максим- Автор вопроса
Arthur G
Вы последовательно записываете.

последовательно, но точно быстрее чем 1 запись в секунду

Максим
последовательно, но точно быстрее чем 1 запись в с...

Просто если у вас несколько клиентов, то последовательной записи не будет.

Максим- Автор вопроса
Arthur G
Запустите параллельно.

получиться, что при параллельном обновлении двух разных элементов документа, есть риск что одно из обновлений не сохранится?

Максим- Автор вопроса
Arthur G
Да.

как тогда лучше поступить мне?

Максим
как тогда лучше поступить мне?

В транзакции читаете документ и запускаете его обновление.

Максим- Автор вопроса
Arthur G
В транзакции читаете документ и запускаете его обн...

вот это ? https://firebase.google.com/docs/firestore/manage-data/transactions?authuser=0

Максим- Автор вопроса
Arthur G
В транзакции читаете документ и запускаете его обн...

Сделал по документации: try { await runTransaction(db, async (transaction) => { const sfDoc = await transaction.get(docRefFinal); if (!sfDoc.exists()) { throw "Document does not exist!"; } transaction.update(docRefFinal, { [data?.id]: newData }); }); } catch (e) {} Не совсем понимаю, нужно ли мне использовать const sfDoc = await transaction.get(docRefFinal)? Сам по себе код работает сейчас так же, данные изменяются корректно в базе.

Максим- Автор вопроса
Arthur G
try { … } catch (e) { console.error(e) }

Ну да, то же что у меня. При обновлении строки пользователем, я передаю её целиком в документ. Мне только необходимо что бы функция записи, эти данные записала в момент когда других транзакций не было и обновление документа происходит в его последней версии. Как я понял тот код что я сделал решает это, или я ошибаюсь?

У вас catch блок пустой, вы ошибки не увидите никогда.

Максим- Автор вопроса
Arthur G
У вас catch блок пустой, вы ошибки не увидите нико...

С этим мне всё понятно) Я пока не могу понять будет ли мой код (до момента возможной ошибки) работать так как мне нужно.

Максим- Автор вопроса
Максим- Автор вопроса
Arthur G
Вы параллельно его запустили?

Запустил параллельно, получаю кучу предупреждений в консоль, но данные записывает корректно, но чуть медленнее.

Да, похоже не правду. По умолчанию, транзакция повторяется в случае неудачи до 5 раз.

Максим- Автор вопроса
Arthur G
Да, похоже не правду. По умолчанию, транзакция пов...

То есть, после 5 раз я получу не предупреждение а уже какую-то ошибку?

Максим- Автор вопроса
Arthur G
Да.

Фух.. спасибо большое за помощь) Надеюсь это будет работать в итоге)

https://firebase.google.com/docs/firestore/query-data/index-overview#single-field_index_exemptions

Arthur G
https://firebase.google.com/docs/firestore/query-d...

{ records: { item1: {...}, item2: {...}, item3: {...}, ... item1000: {...} } }

Максим- Автор вопроса
Arthur G
{ records: { item1: {...}, item2: {...},...

только я не знаю названий item1,item2...и т.д., это уникальные идентификаторы которые генерирует база данных generateId() { const newId = push(child(ref(db), 'generatorIds')).key; return newId; },

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта