Добавление документа с определенным идентификатором без перезаписи существующего - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь добавить документ с моим уникальным идентификатором в Firestore, поэтому set (), кажется, является способом, учитывая, что add () автоматически сгенерирует идентификатор. Я хочу получить сообщение об ошибке, если добавлю новый документ с существующим идентификатором.

Итак, я хочу добавить myObj и хочу, чтобы id документа был myObj.id:

.
db.collection(COLLECTION_NAME).doc(myObj.code)
    .set(myObj)
    .then(() => {
      console.log('SENT!');
    })
    .catch(error => {
      console.error('Error: ', error);
    })

Но когда я добавляю новый документ с существующим идентификатором, вместо сообщения об ошибке, он перезаписывает его.

Я думал об использовании правил БД, но мне все еще не совсем ясно. Мне нужно будет отрицать только эту операцию, но если я хочу обновить поле определенного документа, я смогу это сделать.

Есть ли способ сделать это?

1 Ответ

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

Обновление после вашего комментария :

Ваше требование: «Я хочу добавить новый документ с идентификатором:« 1A2b3Cd », если он не существует, и если он существует, и я пытаюсь добавить новый документ с идентификатором:« 1A2b3Cd », я хочу чтобы получить ошибку. "

Я думаю, что лучше было бы использовать транзакцию следующим образом:

var docRef = db.collection(COLLECTION_NAME).doc(myObj.code);

return db.runTransaction(function(transaction) {
    return transaction.get(docRef).then(function(doc) {
        if (doc.exists) {
            throw "Document already exists!";
        }

        transaction.set(docRef, myObj);
    });
}).then(function() {
    console.log("Transaction successfully committed!");
}).catch(function(error) {
    console.log("Transaction failed: ", error);
});

Как подробно описано в doc с методом set(), «если документ еще не существует, он будет создан».


Если вы хотите «обновить поле определенного (существующего) документа», вы должны предоставить объект SetOptions с merge: true до set() метод следующим образом (выдержка из doc ):

var cityRef = db.collection('cities').doc('BJ');

var setWithMerge = cityRef.set({
    capital: true
}, { merge: true });

Итак, в вашем случае:

db.collection(COLLECTION_NAME).doc(myObj.code)
    .set(myObj, { merge: true })
    .then(() => {
      console.log('SENT!');
    })
    .catch(error => {
      console.error('Error: ', error);
    })

Обратите внимание, что разница с методом update() заключается в том, что при update() «обновление завершится неудачей, если применить его к документу, который не существует».

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