Мое приложение анализирует некоторые JSON и создает данные, подобные этим:
School -- has several sub collections...
|
Classrooms -- about 25 docs
|
Staff -- about 30 docs
|
Families -- ~350 docs, each with sub collections...
|
Parents -- a few docs, usually 2
|
Students -- a few docs, usually 1 or 2
Всего около 1500 документов, которые я пишу в нескольких пакетных наборах, используя следующий код (для создания он использует только 'set'):
// this.batchOps is a large array of:
// [ { operation:'set', ref: firestore ref, data: { simple object }, ...]
performBatchOps () {
if (this.batchOps.length === 0) return Promise.resolve()
const batchSize = 200 // I realize this may be as high as 500
let batch = db.batch();
this.batchOps.slice(0, batchSize).forEach(s => {
if (s.operation === 'set') batch.set(s.ref, s.data)
else if (s.operation === 'update') batch.update(s.ref, s.data)
else if (s.operation === 'delete') batch.delete(s.ref)
})
return batch.commit().then(() => this.performBatchOps(this.batchOps.slice(batchSize)))
}
У меня есть две версии этого кода. Один надежно преуспевает, а другой надежно терпит неудачу. Единственная разница между двумя версиями состоит в том, что успешная создает школу (родителя всего) перед партией, а неудачная создает школу в партии ...
// works
return schoolRef.set(schoolData).then(() => {
this.batchOps = this.parseJSON(someJson)
return this.performBatchOps() // these batch ops don't contain a set for the school
})
// breaks
let batchOps = this.parseJSON(someJson) // the first batch op sets the school
return performBatchOps()
Мне кажется, я понимаю, что пакетные записи не сохраняют порядок, и я подумал, что понял, что создание такого документа, как: database / x / y / z / document, может предшествовать созданию дерево над ним (то, что он пишет, неявно записывает свою родословную).
Ошибка проявляется в журналах как Error: 10 ABORTED: Too much contention on these documents. Please try again.
, , как описано в этом вопросе (когда я думал, что проблема связана с триггеры, которые запускаются при создании).
Я знаю, что сначала мне придется изменить код, чтобы написать школу, выполните c, но я должен также переставить дочерние записи (настроить целое дерево вне пакета и пишите только в пакетном режиме)?
Я полагаю, ошибка состязания связана с разногласиями в школе c. Есть ли место, где я могу / мог обнаружить это в журналах? Это сэкономило бы мне кучу циклов развертывания-тестирования-исправления.