#javascript #node.js #firebase #google-cloud-firestore
#javascript #node.js #firebase #google-облако-firestore
Вопрос:
Я пытаюсь выполнить простой поисковый запрос, как показано ниже.
SELECT post.title as "Post Title", user.email as "Author Email"
FROM User
JOIN Post ON User.id = Post.userID
WHERE Post.title LIKE '%retriever%';
Я знаю, что не могу выполнить поиск по вложенной коллекции
в итоге я создал две корневые коллекции: пользователи, сообщения.
Ниже приведена моя жалкая попытка выполнить такой запрос
const db = firebase.firestore()
const ref = db.collection('Post')
const postTitle = await ref
.orderBy('title')
.startAt('Springfield')
.get();
const userEmail = await db.collection('User')
.where('id', '==', 'postTitle.userId')
.document('email');
Как мне достичь вышеуказанного результата в данном конкретном случае?
Комментарии:
1.
'postTitle.userId'
— если это не фактическая переменная, удалите одинарные кавычки, и это может привести к тому, что вы ищете. Просто первое, что я увидел.2. @Torewin это правильный способ сделать это?
Ответ №1:
Хорошо, сначала позвольте мне подтвердить, что я понимаю SQL.
Вы хотите вернуть две переменные (заголовок, адрес электронной почты) из таблицы User
SELECT post.title as "Post Title", user.email as "Author Email"
FROM User
Затем вы хотите присоединиться к таблице Post, где ‘User.id ‘равно ‘Post.userId’, так что, по сути, поиск сообщений пользователей.
JOIN Post ON User.id = Post.userID
WHERE Post.title LIKE '%retriever%';
Если моя оценка точна и не зная вашей модели данных, я могу дать приблизительное предположение о том, как это будет выглядеть.
//Reference to Firestore
const db = firebase.firestore()
//Reference to the Post "table" Collection
const ref = db.collection('Post')
//This is assuming I know the USER ID that I need - if I don't have it, we can retrieve it by their email 'admin.auth().getUserByEmail(email)' or somewhere else.
//This example should still work with whatever the 'id' key is representing in the Post model
const postsByUserID = await ref.where('id', '==', userID).get();
if (postsByUserID.empty) {
console.log('No matching documents.');
return;
}
//This will loop through every Post that we got that matched the user's ID
postsByUserID.forEach(doc => {
console.log(doc.id, '=>', doc.data());
});
Имейте в виду, что предполагается, что «идентификатор» из вашей модели Post равен UID пользователя.
Если мы предположим, что мы не знаем идентификатор пользователя и хотим получить каждого пользователя, а затем сообщения с идентификатором, равным идентификатору этого пользователя:
//Reference to the Post "table" Collection
const ref = db.collection('Users')
const allUsers = await ref.get();
allUsers.forEach(doc => {
console.log(doc.id, '=>', doc.data());
const userID = doc.data().id;
const postsByUserID = await ref.where('id', '==', userID).get();
if (postsByUserID.empty) {
console.log('No matching documents.');
return;
}
//This will loop through every Post that we got that matched the user's ID
postsByUserID.forEach(doc => {
console.log(doc.id, '=>', doc.data());
});
});
Комментарии:
1. Я не уверен, правильно ли я понимаю ваше понимание, но позвольте мне подробнее остановиться на ситуации. Итак, допустим, пользователь хочет выполнить поиск по сообщению, связанному с retriever. Пользователь вводит retriever. В этом случае нам нужно имя автора, которого НЕТ в post. Post ссылается на userId для получения данных от пользователя. Итак, в этом случае мы получаем переменную «%retriever%», которая является поисковым термином. Итак, в конце концов, моя цель — найти подходящие данные, которые я хочу показать пользователю, на основе поискового запроса.
2. Хм, если я вас правильно понимаю, то вы, по сути, просто хотите выполнить простой поиск по сообщениям на основе запроса? Например, у меня есть сообщение с заголовком «Это коричневая лиса», и я запрашиваю «Лиса». Он должен вернуть это сообщение? Да?
3. да и пользовательское электронное письмо от. Сбор пользователей также
4. Firestore не может запрашивать «строки», похожие на строку. Вы можете запрашивать документы, которые точно соответствуют «Это коричневая лиса», но не находить документы, содержащие «Лиса». Вы можете сделать это, если вы разделяете ключевые слова или теги в массив, а затем запрашиваете, есть ли одна из этих строк в этом массиве, но вы все равно не сможете ввести «Fo» и получить «Fox». Если вы можете предположить, что поисковый запрос ВСЕГДА будет точным (или Bool или диапазон чисел), то это возможно.
5. Еще раз спасибо за проработку. Я не совсем понял: «вы можете сделать это, если вы разделяете ключевые слова или теги в массив, а затем запрашиваете, находится ли одна из этих строк в этом массиве». Не могли бы вы показать мне какой-нибудь пример?