Добавление документов в Firestore с полем, которое должно быть уникальным - PullRequest
0 голосов
/ 21 января 2020

Предположим, что два пользователя на разных устройствах одновременно выполняют следующую операцию.

пользователь один:

db.collection('agents').where('phone','==','9876543210')
  .get()
  .then(function(querySnapshot) {
        let agents = [];
        querySnapshot.forEach(function(doc) {
            agents.push(doc.data());
        });

        if(agents.length > 0){
          agentExists();
        }
        else{
          db.collection('agents').add({
            firstName: "ABC",
            lastName: "XYZ",
            phone: "9876543210"
          })
          .then(function(){
             agentAdded();
          });
        }
  })
  .catch(function(err){
     console.log(err);
  });

пользователь два:

db.collection('agents').where('phone','==','9876543210')
  .get()
  .then(function(querySnapshot) {
        let agents = [];
        querySnapshot.forEach(function(doc) {
            agents.push(doc.data());
        });

        if(agents.length > 0){
          agentExists();
        }
        else{
          db.collection('agents').add({
            firstName: "MNO",
            lastName: "PQR",
            phone: "9876543210"
          })
          .then(function(){
             agentAdded();
          });
        }
  })
  .catch(function(err){
     console.log(err);
  });

где пользователи пытаются добавить информацию об агенте с разными firstName и lastName, но с одним и тем же номером телефона, а код написан таким образом, что первый запрос ищет номер, если он существует, агент не добавляется в коллекцию, если он этого не делает тогда это добавлено. Но когда оба пользователя выполняют вышеуказанные операции одновременно, оба агента добавляются, тогда как мое требование - разрешить добавление только одного агента, поскольку номер телефона будет дублирован.

Попробовали другие решения: Пробовал использовать метод onSnapshot () , чтобы получать обновления в реальном времени, но, как мы знаем, firestore sdk сначала добавляет документ в кэш, а затем в бэкэнд, поэтому, когда добавляется новый агент, сначала он показывает выход агента, а затем показывает агент добавлен.

Ответы [ 2 ]

1 голос
/ 21 января 2020

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

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

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

0 голосов
/ 21 января 2020

Если вы не хотите сохранять номер телефона в качестве ключа, тогда вам следует использовать транзакции.

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