Próbuję zaktualizować wszystkie dokumenty w kolekcji z funkcją chmur. Dzięki tym kodzie działało na aktualizację jednego dokumentu (z ID 0) w kolekcji Rekoracje:

exports.decreaseQuestionRestDuration = functions.https.onRequest((request, response) => {
   const test = admin.firestore().doc('releasedQuestions/0').update({restDuration: 42})
        .then(snapshot => {
            response.send(0)
        })
        .catch(error => {
            console.log(error)
            response.status(500).send(error)
        })
});

Ale kiedy zaktualizuję wszystkie dokumenty w kolekcji z taką ścieżką wieloznaczną:

const test = admin.firestore().doc('releasedQuestions/{qid}').update({restDuration: 42})

To nie działa. Czy ktoś może mi pomóc?

Moja struktura Firestore Cloud to: Cloud Firestore Structure

0
Marcel 21 marzec 2020, 14:40

1 odpowiedź

Najlepsza odpowiedź

Składnia ścieżki wieloznacznej, której używasz (tj {x0}}) może być używany tylko w funkcjach w chmurze Definicja , gdy na przykład zdefiniujesz wyzwalacz Cloud Firestore, określając ścieżkę dokumentów i zdarzenie Wpisz, w następujący sposób:

exports.useWildcard = functions.firestore
    .document('users/{userId}')
    .onWrite((change, context) => {...});

W twoim przypadku faktycznie dzwonisz do doc(), dla których parametr documentPath powinien być string. Dlatego działa w pierwszym przypadku, ale nie w drugim (nie ma żadnego dokumentu Firestore z ID {qid} w swojej kolekcji).


Jeśli chcesz, w funkcji Cloud HTTP, aby zaktualizować wszystkie dokumenty z kolekcji, można użyć a Warto pisze, w następujący sposób:

exports.decreaseQuestionRestDuration = functions.https.onRequest((request, response) => {

    const db = admin.firestore();

    db.collection('releasedQuestions').get()
        .then(snapshot => {
            let batch = db.batch();
            snapshot.forEach(doc => {
                batch.update(doc.ref, { restDuration: 42 });
            });
            return batch.commit()
        })
        .then(() => {
            response.send(0)
        })
        .catch(error => {
            console.log(error)
            response.status(500).send(error)
        })

});

Należy jednak zauważyć, że wtrącony pisze może zawierać do 500 operacji. Dlatego też, jeśli twoja kolekcja zawiera ponad 500 dokumentów, możesz użyć Promise.all().


W boku, warto zauważyć istnienie Literałów szablonów .

Literałów szablonów są zamknięty przez znak backtick (grób accent) zamiast podwójnych lub pojedynczych cytatów ... i może zawierać symbole zastępcze.

2
Renaud Tarnec 21 marzec 2020, 14:57