Обновление Multib Collection Firebase - PullRequest
0 голосов
/ 11 декабря 2018

Есть ли способ обновить два документа, каждый в другой коллекции, в одном запросе?

Я знаю, что вы можете выполнить пакетную запись, используя FIRWriteBatch- Кажется, это ограничено той же коллекцией для любых обновлений документа.При попытке прикрепить обновления для документов в двух разных коллекциях:

// Just for example
FIRWriteBatch *batch = FIRWriteBatch.new;

[batch updateData:@{@"posts" : @1} forDocument:[self.firebase.usersCollection documentWithPath:@"some_user_id"]];
[batch setData:@{@"test" : @"cool"} forDocument:[self.firebase.postsCollection documentWithPath:@"some_post_id"]];

[batch commitWithCompletion:^(NSError * _Nullable error) {

    NSLog(@"error: %@", error.localizedDescription);

}];

Он никогда не выполняется - приложение вылетает, и я получаю следующее:

Terminating app due to uncaught exception 'FIRInvalidArgumentException', reason: 
'Provided document reference is from a different Firestore instance.'

Видимо, пакет ненапример, обновления в более чем одной коллекции.

  • Кто-нибудь знает, как можно обновить два документа, каждый в другой коллекции, без сбоя одного и последующего?

Я хочу избежать, например, успешного задания posts = 1 для документа в usersCollection , в то время как не удалось записать новый документ в postsCollection .

Я понимаю, что маловероятно, что один из них напишет, а другой потерпит неудачу, но в случае, если это произойдет , я, очевидно, не хочу противоречивых данных.


ПРИМЕЧАНИЕ:

Для всех, кому не все равно - я не знаю, выйдет ли когда-нибудь , но сейчас я выполняю транзакцию без чтение документа перед обновлением данных... ?‍♂️ Приветствие к -1 вызову API!

1 Ответ

0 голосов
/ 11 декабря 2018

Вы должны использовать транзакцию , которая задокументирована рядом с пакетной записью:

Используя клиентские библиотеки Cloud Firestore, вы можете сгруппировать несколько операций в одну транзакцию.Транзакции полезны, когда вы хотите обновить значение поля на основе его текущего значения или значения какого-либо другого поля.Вы можете увеличить счетчик, создав транзакцию, которая считывает текущее значение счетчика, увеличивает его и записывает новое значение в Cloud Firestore.

Вы не ограничены одной коллекцией при выполнениисделка.Вы просто обязаны прочитать документ перед тем, как его написать:

Транзакция состоит из любого числа операций get (), за которыми следует любое количество операций записи, таких как set (), update (),или удалить ().В случае одновременного редактирования Cloud Firestore снова запускает всю транзакцию.Например, если транзакция читает документы, а другой клиент изменяет какой-либо из этих документов, Cloud Firestore повторяет транзакцию.Эта функция гарантирует, что транзакция выполняется на актуальных и согласованных данных.

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