Firestore В статье [дубликат]

Оператор == проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals() проверьте фактическое содержимое строки (значение).

Обратите внимание, что метод .equals() принадлежит классу Object (суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.

  • Случай 1
    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true
    
    Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле.
  • Случай 2
    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true
    
    Причина. Если вы создаете объект String с использованием ключевого слова new, ему выделяется отдельное пространство в куче.
30
задан Joon 14 October 2017 в 02:26
поделиться

6 ответов

Конечно, лучший способ сделать это - реализовать фактический запрос Firestore в Cloud Function? Тогда будет только один обратный звонок от клиента к Firebase, который, похоже, является тем, о чем вы просите.

Вы действительно хотите сохранить всю логику доступа к данным, такую ​​как эта серверная сторона во всяком случае.

Внутри, вероятно, будет одинаковое количество вызовов самой Firebase, но все они будут связаны с сверхбыстрыми межсоединениями Google, а не с внешней сетью, и в сочетании с конвейерной поддержкой, которую Франк ван Пуффлен объяснил, вы должны получить отличную производительность от этого подхода.

2
ответ дан Chris Wilson 15 August 2018 в 20:06
поделиться
  • 1
    Хранение реализации в Cloud Function является правильным решением в некоторых случаях, когда у вас сложная логика, но, вероятно, не в том случае, когда вы просто хотите объединить список с несколькими идентификаторами. То, что вы теряете, - это кэширование на стороне клиента и стандартизованное форматирование возврата из обычных вызовов. Это вызвало больше проблем с производительностью, чем в некоторых случаях в моих приложениях, когда я использовал этот подход. – Jeremiah 7 March 2018 в 21:45

В настоящее время это не представляется возможным в Firestore. Я не понимаю, почему ответ Александра принят, решение, которое он предлагает, просто возвращает все документы в коллекции «users».

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

0
ответ дан Horea 15 August 2018 в 20:06
поделиться

Вы можете использовать такую ​​функцию:

function getById (path, id) {
  return firestore.getAll(
    [].concat(ids).map(id => firestore.doc(`${path}/${id}`)
  )
}

Его можно вызывать с помощью одного ID:

getById('collection', 'some_id')

или массива идентификаторов:

getById('collection', ['some_id', 'some_other_id'])
0
ответ дан JP de la Torre 15 August 2018 в 20:06
поделиться

, если вы находитесь в узле:

https://github.com/googleapis/nodejs-firestore/blob/master/src/index.js#L533

/**
* Retrieves multiple documents from Firestore.
*
* @param {...DocumentReference} documents - The document references
* to receive.
* @returns {Promise<Array.<DocumentSnapshot>>} A Promise that
* contains an array with the resulting document snapshots.
*
* @example
* let documentRef1 = firestore.doc('col/doc1');
* let documentRef2 = firestore.doc('col/doc2');
*
* firestore.getAll(documentRef1, documentRef2).then(docs => {
*   console.log(`First document: ${JSON.stringify(docs[0])}`);
*   console.log(`Second document: ${JSON.stringify(docs[1])}`);
* });
*/
15
ответ дан Nick Franceschina 15 August 2018 в 20:06
поделиться
  • 1
    Для тех, кто хочет вызвать этот метод с динамически созданным массивом ссылок на документы, вы можете сделать это следующим образом: firestore.getAll (... arrayOfReferences) .then () – Horea 6 March 2018 в 18:32
  • 2
    – Xar E Ahmer 29 August 2018 в 05:11

Нет, сейчас нет возможности выполнять множественные запросы на чтение с использованием SDK Cloud Firestore и, следовательно, не может гарантировать, что вы можете сразу считывать все данные.

Однако, как Франк ван Пуффлен сказал в комментариях выше, это не означает, что выборка 3 документов будет в 3 раза медленнее, чем выбор одного документа. Лучше всего выполнить свои собственные измерения, прежде чем сделать вывод здесь.

7
ответ дан Sam Stern 15 August 2018 в 20:06
поделиться
  • 1
    Дело в том, что я хочу знать теоретические пределы работы Firestore, прежде чем перейти на Firestore. Я не хочу мигрировать, а потом понимаю, что это недостаточно для моего варианта использования. – Joon 17 October 2017 в 02:09
  • 2
    Для меня никакой пакетной поддержки не очень хорошо. Поскольку большинство запросов к базе данных моего приложения связаны с получением нескольких (часто раз сотни) документов с несколькими идентификаторами. Чтобы быть исполненными, эти звонки должны быть собраны для меня. – Joon 17 October 2017 в 02:11
  • 3
    @Joon это звучит так, как вам придется переоценивать ваши структуры данных, чтобы они были более эффективными в базе данных NoSQL, например Cloud Firestore. Лучший совет, который я могу дать, - это думать назад от запросов. Подумайте о запросе, который вы хотите выполнить, и структурируйте свои данные, чтобы вы могли выразить это просто. Все запросы в Cloud Firestore бывают быстрыми. – Sam Stern 17 October 2017 в 15:08
  • 4
    Привет, здесь также есть пояснение косы. Скажем, я сохранил список всех идентификаторов моего друга, а число - 500. Я могу получить список по 1 цене чтения, но для того, чтобы отобразить их имя и фотоURL, это обойдется мне в 500 раз. – Tapas Mukherjee 25 October 2017 в 22:02
  • 5
    @FrankvanPuffelen Например, в mongoDb вы можете использовать ObjectId, как stackoverflow.com/a/32264630/648851 . – Sitian Liu 27 October 2017 в 21:17
0
ответ дан Ron Royston 29 October 2018 в 03:19
поделиться
Другие вопросы по тегам:

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