Оператор ==
проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals()
проверьте фактическое содержимое строки (значение).
Обратите внимание, что метод .equals()
принадлежит классу Object
(суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.
String s1 = "Stack Overflow";
String s2 = "Stack Overflow";
s1 == s2; //true
s1.equals(s2); //true
Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле. String s1 = new String("Stack Overflow");
String s2 = new String("Stack Overflow");
s1 == s2; //false
s1.equals(s2); //true
Причина. Если вы создаете объект String с использованием ключевого слова new
, ему выделяется отдельное пространство в куче. Конечно, лучший способ сделать это - реализовать фактический запрос Firestore в Cloud Function? Тогда будет только один обратный звонок от клиента к Firebase, который, похоже, является тем, о чем вы просите.
Вы действительно хотите сохранить всю логику доступа к данным, такую как эта серверная сторона во всяком случае.
Внутри, вероятно, будет одинаковое количество вызовов самой Firebase, но все они будут связаны с сверхбыстрыми межсоединениями Google, а не с внешней сетью, и в сочетании с конвейерной поддержкой, которую Франк ван Пуффлен объяснил, вы должны получить отличную производительность от этого подхода.
В настоящее время это не представляется возможным в Firestore. Я не понимаю, почему ответ Александра принят, решение, которое он предлагает, просто возвращает все документы в коллекции «users».
В зависимости от того, что вам нужно сделать, вы должны изучить дублирование соответствующих данных вам нужно отобразить и запросить только полный документ, если это необходимо.
Вы можете использовать такую функцию:
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'])
, если вы находитесь в узле:
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])}`);
* });
*/
Нет, сейчас нет возможности выполнять множественные запросы на чтение с использованием SDK Cloud Firestore и, следовательно, не может гарантировать, что вы можете сразу считывать все данные.
Однако, как Франк ван Пуффлен сказал в комментариях выше, это не означает, что выборка 3 документов будет в 3 раза медленнее, чем выбор одного документа. Лучше всего выполнить свои собственные измерения, прежде чем сделать вывод здесь.