Как вы можете найти что-то внутри облачного Firestore, если вы не знаете ключ? - PullRequest
3 голосов
/ 31 октября 2019

Теперь предположим, что у меня около миллиона пользователей с userId (это, вероятно, будет коллекция)

1234567
1223452
1223454
1223456
1223425
1225451
......
......
......

Теперь каждая коллекция содержит документы, которые будут выглядеть примерно так:

1234567 
  --- userauth 
  ------ email: any123@gmail.com
1223452
  --- userauth 
  ------ email: varun123@gmail.com
......
......
......

Теперь, если я хочу найти идентификатор пользователя с конкретным идентификатором электронной почты (скажем, any123@gmail.com), как бы я это сделал?

По этому вопросу я работаю внутрифункции облака.

Будет ли она более эффективной, чем SQL?

Обновление: В ответ я сделал что-то подобное

class docStore() {
 constructor (firestore) {
  this.store = firestore 
 }

async query(collection, condition) {
        let colRef = this.store.collection(collection)
        if (_.isArray(condition)) {
            condition.forEach(predicate => {
                colRef = colRef.where(predicate.name, predicate.op, predicate.value)
            })
        }

        const results = []
        const snapshot = await colRef.get()
        snapshot.forEach(doc => {
            results.push({data: doc.data(), id:doc.id})
        })
        console.notice(results)
        return results
    }

}

Где this.store равно admin.firestore()

И мой запрос такой

const checkIfEmailExsist = await docStore.query(SIGNUP_TABLES.userAuth, ['email', '==', userEmail])

Здесь docStore выше класса, и я ссылаюсь на запрос внутри него

Это дает мне следующую ошибку

[2019-11-01T13: 52: 36.873Z] (узел: 94753) UnhandledPromiseRejectionWarning: Ошибка: значение для аргумента "fieldPath" недопустимополевой путь. Путь не может быть пропущен.

Есть идеи, что я могу делать неправильно?

1 Ответ

3 голосов
/ 31 октября 2019

Спасибо, что ответили, что вы работали внутри облачных функций и, таким образом, используете API администратора. Вот снова ссылка на , как сделать запрос в firestore .

Простая функция для демонстрации запроса, подобного приведенному выше (я предполагаю, что коллекция называется 'users') находится здесь:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

let db = admin.firestore();

exports.doQuery = functions.https.onRequest((request, response) => {
    const queryRef = db.collection('users').where('email', '==', 'any123@gmail.com');

    queryRef.get().then((snap) => {
      if (snap.empty) {
        response.send('no result');
      } else {
        let result = '';
        snap.forEach((doc) => {
          result = result + doc.id + ' => ' + JSON.stringify(doc.data()) + '<br>';
        })
        response.send(result);
      }
    }).catch((err) => { response.send('error'); });

  });

В вашем примере, хотя вы показываете, что существует промежуточный уровень userauth. Предполагая, что это карта (а не, скажем, другая коллекция или что-то в этом роде), вы можете использовать FieldPath, чтобы ваш запрос проходил по карте. Этот запрос будет выглядеть следующим образом и будет по-прежнему возвращать весь пользовательский документ:

    const queryRef = db.collection('userProfiles').where(
      new admin.firestore.FieldPath('userauth','email'), '==', 'any123@gmail.com');

Что касается вопроса эффективности, этот тип запроса (простое равенство) будет довольно эффективно выполнять в firestore, так какпо умолчанию вы получаете индекс для каждого значения. Более сложные запросы могут быть более дорогими, и вам потребуется создать индекс . Кроме того, с взимается плата только за возвращенные документы (при наличии как минимум одного документа для пустого набора результатов).

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

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