Пакетное письмо в магазине, можно ли писать детям раньше родителей? - PullRequest
0 голосов
/ 29 апреля 2020

Мое приложение анализирует некоторые 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. Есть ли место, где я могу / мог обнаружить это в журналах? Это сэкономило бы мне кучу циклов развертывания-тестирования-исправления.

1 Ответ

0 голосов
/ 29 апреля 2020

Порядок операций в пакете не имеет значения вообще, независимо от отношения родитель / потомок. Дочерние документы могут прекрасно существовать без родительского документа - они совершенно не связаны друг с другом, за исключением того, как вы определяете их отношение.

Сообщение об ошибке говорит о том, что вы выполняете слишком много записей слишком быстро на один документ, вероятно, что школа делает c, как вы упомянули. Согласно документации ограничение записи для одного документа составляет 1 в секунду. Вы можете превзойти это в короткой серии, но это не выдержит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...