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

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

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

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

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

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

37 ответов

77 просмотров

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

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

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

Меньше 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; },

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
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
Карта сайта