Firebase - Firestore - проверка правил для существования свойства [дубликат]

Java имеет пул строк, в котором Java управляет распределением памяти для объектов String. См. String Pools в Java

Когда вы проверяете (сравниваете) два объекта с помощью оператора ==, он сравнивает равенство адресов в пуле строк. Если два объекта String имеют одинаковые адреса, то он возвращает true, в противном случае false. Но если вы хотите сравнить содержимое двух объектов String, вы должны переопределить метод equals.

equals - фактически метод класса Object, но он переопределяется в класс String и дается новое определение, которое сравнивает содержимое объекта.

Example:
    stringObjectOne.equals(stringObjectTwo);

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

Давайте посмотрим:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

9
задан crazypeter 22 November 2017 в 23:22
поделиться

3 ответа

Создайте серию облачных функций, которые запускаются всякий раз, когда документ добавляется, обновляется или удаляется в таблице users. Облачные функции будут поддерживать отдельную таблицу поиска с именем usernames, с идентификаторами документов, установленными на имена пользователей. Ваше внешнее приложение может затем запросить коллекцию usernames, чтобы узнать, доступно ли имя пользователя.

Вот код TypeScript для облачных функций:

/* Whenever a user document is added, if it contains a username, add that
   to the usernames collection. */
export const userCreated = functions.firestore
  .document('users/{userId}')
  .onCreate((event) => {

    const data = event.data();
    const username = data.username.toLowerCase().trim();

    if (username !== '') {
      const db = admin.firestore();
      /* just create an empty doc. We don't need any data - just the presence 
         or absence of the document is all we need */
      return db.doc(`/usernames/${username}`).set({});
    } else {
      return true;
    }

  });

  /* Whenever a user document is deleted, if it contained a username, delete 
     that from the usernames collection. */
  export const userDeleted = functions.firestore
    .document('users/{userId}')
    .onDelete((event) => {

      const data = event.data();
      const username = data.username.toLowerCase().trim();

      if (username !== '') {
        const db = admin.firestore();
        return db.doc(`/usernames/${username}`).delete();
      }
      return true;
    });

/* Whenever a user document is modified, if the username changed, set and
   delete documents to change it in the usernames collection.  */
export const userUpdated = functions.firestore
  .document('users/{userId}')
  .onUpdate((event, context) => {

    const oldData = event.before.data();
    const newData = event.after.data();

    if ( oldData.username === newData.username ) {
      // if the username didn't change, we don't need to do anything
      return true;
    }

    const oldUsername = oldData.username.toLowerCase().trim();
    const newUsername = newData.username.toLowerCase().trim();

    const db = admin.firestore();
    const batch = db.batch();

    if ( oldUsername !== '' ) {
      const oldRef = db.collection("usernames").doc(oldUsername);
      batch.delete(oldRef);
    }

    if ( newUsername !== '' ) {
      const newRef = db.collection("usernames").doc(newUsername);
      batch.set(newRef,{});
    }

    return batch.commit();
  });
1
ответ дан Derrick Miller 16 August 2018 в 10:31
поделиться

@asciimike в twitter является разработчиком правил безопасности firebase. Он говорит, что в настоящее время нет способа обеспечить уникальность ключа в документе. https://twitter.com/asciimike/status/937032291511025664

Так как firestore основан на Google Cloud datastore, он наследует эту проблему. Это длительный запрос с 2008 года. https://issuetracker.google.com/issues/35875869#c14

Однако вы можете достичь своей цели, используя firebase functions и некоторые строгие security rules.

Вы можете просмотреть все предлагаемое решение на носителе. https://medium.com/@jqualls/firebase-firestore-unique-constraints-d0673b7a4952

11
ответ дан jqualls 16 August 2018 в 10:31
поделиться
  • 1
    Спасибо за эту рецензию. Я более подробно рассмотрю это. – crazypeter 4 December 2017 в 19:04

Сохраните список имен пользователей в качестве ключей. Проверьте это. Я знаю, что это не идеально, но это самый быстрый / простой способ.

-1
ответ дан Oliver Dixon 16 August 2018 в 10:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: