firebase firestore добавление нового документа внутри транзакции - транзакция .add не является функцией - PullRequest
1 голос
/ 14 апреля 2019

Я предполагал, что можно сделать что-то вроде:

transaction.add(collectionRef,{
  uid: userId,
  name: name,
  fsTimestamp: firebase.firestore.Timestamp.now(),
});

Но, видимо, это не так:

транзакция.адд не является функцией

Вышеуказанное сообщение отображается внутри хромированной консоли.

Я вижу, что мы можем использовать метод транзакции set для добавления нового документа в транзакции. см .: https://firebase.google.com/docs/firestore/manage-data/transactions

Дело в том, что если я использую set вместо add (что не поддерживается в любом случае), идентификатор документа должен быть создан мной вручную, Firestore не будет его создавать. см .: https://firebase.google.com/docs/firestore/manage-data/add-data

Видите ли вы в этом недостаток отсутствия метода добавления, который автоматически генерирует для вас идентификатор?

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

Какую библиотеку / метод вы используете для создания идентификаторов документов в реагирующем языке при использовании транзакции.set?

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

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

(То, что вы предлагаете в своем ответе, - это еще больше работы для того же эффекта.)

// Create a reference to a document that doesn't exist yet, it has a random id
const newDocRef = db.collectionRef('coll').doc();

// Then, later in a transaction:
transaction.set(newDocRef, { ... });
0 голосов
/ 14 апреля 2019

после еще нескольких копаний я нашел в исходном коде самого пожарного депо следующий класс / метод для генерации идентификатора:

export class AutoId {
  static newId(): string {
    // Alphanumeric characters
    const chars =
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let autoId = '';
    for (let i = 0; i < 20; i++) {
      autoId += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    assert(autoId.length === 20, 'Invalid auto ID: ' + autoId);
    return autoId;
  }
}

см .: https://github.com/firebase/firebase-js-sdk/blob/73a586c92afe3f39a844b2be86086fddb6877bb7/packages/firestore/src/util/misc.ts#L36

Я извлек метод(кроме оператора assert) и поместите его в метод в моем коде.Затем я использовал заданный метод транзакции, как показано ниже:

generateFirestoreId(){
        const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        let autoId = '';
        for (let i = 0; i < 20; i++) {
            autoId += chars.charAt(Math.floor(Math.random() * chars.length));
        }
        //assert(autoId.length === 20, 'Invalid auto ID: ' + autoId);
        return autoId;
    }

затем

newDocRef = db.collection("PARENTCOLL").doc(PARENTDOCID).collection('SUBCOLL').doc(this.generateFirestoreId());
                        transaction.set(newDocRef,{
                            uid: userId,
                            name: name,
                            fsTimestamp: firebase.firestore.Timestamp.now(),
                        });

Поскольку я использую тот же алгоритм для генерации идентификатора, что и сам пожарный магазин, я чувствую себя лучше,

Надеюсь, это кому-нибудь поможет / поможет.

Приветствия.

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