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

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

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

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

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

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

37 ответов

34 просмотра

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

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

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

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

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
11
У тебя в конфиге нигде нет deny all; или вообще любого deny?
Alexander Sherbakov
10
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
думаешь я не смогу также сделать? мне это просто не удобно
int 💳 𝙖𝙞𝙧 𝙗𝙞𝙜 𝙗𝙤𝙗 🔫 check bio / spam block / AFK / nohello.com / GMT+3
9
Ребят, чет я уже не догоняю... Крч в коде на асм там происходит нечто вроде a+число (a+1, a+2 и т.д.). Но почему строка lea ecx, [edx+1] работает как a+1?? В edx берется адрес...
Alan 🔝 Бэброу
4
Карта сайта