Firestore, как добавить в коллекцию - PullRequest
0 голосов
/ 28 марта 2019

Я хотел бы найти документ в коллекции и добавить элементы во вложенную коллекцию (которая может еще не существовать):

projects (collection)
   project (doc)
      cluster (collection) // might not exist
        node1 (doc)  // might not exist
           statTypeA (collection)  // might not exist

Я надеялся на что-то вроде этого:

// Know the doc:
db.ref(`projects/${projectId}/cluster/node1/${statType}`).add()
// Or filter and ref:  
db.collection('projects').where(..).limit(1).ref(`cluster/node1/${statType}`).add()

В итоге я решил, что это так, но уродливо, многословно и медленно, так как сначала нужно вернуться с несколькими операциями чтения.Правильно ли я это делаю?

const projectRefs = await db.collection('projects')
  .where('licenseKey', '==', licenseKey)
  .limit(1)
  .get();

if (!projectRefs.docs) {
  // handle 404
}

const projectRef = projectRefs.docs[0].ref;

const cluster = await projectRef.collection('cluster')
  .doc('node1').get();

await cluster.ref.collection(statType).add({ something: 'hi' });

Редактировать:

То, как я в итоге справился с этим лучше, - это сочетание уплощения с другими коллекциями, а такжеиспользуя массивы для статистики.Чувствует себя намного лучше:

// projects
{
  projectId1
}

// instances (to-many-relationship) (filter based on projectId)
{
  projectId
  statTypeA: []
  statTypeB: []
}

1 Ответ

1 голос
/ 28 марта 2019

Ваша "неприятная вещь" намного ближе к тому, как все работает.

В первой попытке вы пытаетесь объединить запрос и создания документа в одной операции.SDK не работает так вообще.Вы либо читаете, либо пишете с любым заданным битом кода, но не обоими одновременно.Сначала нужно выполнить запрос, найти документ, а затем использовать его для создания дополнительных документов.

get() возвращает обещание, которое необходимо использовать, чтобы дождаться результатов запроса.,Результаты не доступны сразу, как предполагает ваш код.

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

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