Обновить документ Я не знаю облачных функций do c ID - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь получить доступ к документу, чтобы обновить его, но в коллекции только один документ , я не знаю идентификатор этого документа, как я могу получить доступ к нему, зная, что там w

return admin.firestore().collection('users').doc(uid).collection('score').doc().update({
   points: admin.firestore.FieldValue.increment(10),
})

Этот код не работает, я получаю сообщение об ошибке: Нет документа для обновления.

Я понимаю, что это вызвано вызовом .do c () просто генерирует случайный идентификатор. Итак, как мне получить доступ к do c?

Ответы [ 3 ]

0 голосов
/ 18 июня 2020
 admin.firestore().collection('users').doc(uid).collection('score').get().then(snapshot => {

 const docId = snapshot[0].id;
 return 
    admin.firestore().collection('users').doc(uid).collection('score').doc(docId).update({
    points: admin.firestore.FieldValue.increment(10),
    })
 })

это только для одного c в коллекции. снимок [0] .data (). id return 1st do c ID.

0 голосов
/ 18 июня 2020

Вы можете обновить документ в Firestore, только если вы знаете точный путь к этому документу. Если вы еще не знаете путь, вам придется прочитать документы, чтобы определить это.

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

Код выглядит примерно так:

let collectionRef = admin.firestore().collection('users');
collectionRef.get().then(snapshot => {
  snapshot.forEach(doc => {
    doc.update({
      points: admin.firestore.FieldValue.increment(10),
    })
  });
})
.catch(err => {
  console.log('Error getting documents', err);
});

Также см. Документацию для получения всех документы в коллекции .


Если вы используете это в облачной функции или в другой среде, которая не может оставлять обещания без обработки, вам нужно будет вывести результаты:

let collectionRef = admin.firestore().collection('users');
return collectionRef.get().then(snapshot => {
  return Promise.all(snapshot.documents.map(doc => {
    return doc.update({
      points: admin.firestore.FieldValue.increment(10),
    })
  }));
})
0 голосов
/ 18 июня 2020

Если вы не знаете идентификатор документа, вы не можете просто get() его по отдельности. Вам нужно будет выполнить запрос к коллекции, в которой он находится. Если вы выполните запрос, вам нужно будет либо знать что-то об одном из полей внутри него, либо отфильтровать для него (получение потенциально многих совпадающих документов ), или вам нужно будет просто получить каждый документ в коллекции, не предоставляя никакого фильтра для коллекции.

Для этого нет обходных путей. Вам действительно нужно что-то сделать, чтобы запомнить этот идентификатор документа или что-то знать о его полях.

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