Поиск наличия конкретных детей под узлом - PullRequest
0 голосов
/ 06 сентября 2018

Я разрабатываю приложение чата, используя База данных Firebase Realtime и Облачные функции . У меня есть узел members, где я храню идентификаторы каждого пользователя в каждой комнате чата:

enter image description here

Чего я хочу добиться (пока неэффективно), так это проверить, например, есть ли у user1 randomUid1 ) активный чат с user2 randomUid2 ) наиболее эффективным способом. Единственное решение, которое я нашел, - это загрузить весь узел (/members) и проверить для каждого дочернего элемента снимка данных, если присутствуют два uids. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Следующие работы по внедрению.Но без индексации это приведет к загрузке всего под узлом members и фильтрации данных в клиенте:

const ref = admin.database().ref('members');
const snap1 = await ref.orderByChild('user1').equalTo(true).once('value');
const user1Chats = Object.keys(snap1.val());

const snap2 = await ref.orderByChild('user2').equalTo(true).once('value');
const user2Chats = Object.keys(snap2.val());

user1Chats.forEach((chat) => {
  if (user2Chats.indexOf(chat) >= 0) {
    console.log('Chat in common:', chat);
  }
});

SDK запишет следующее предупреждение:

@firebase/database: FIREBASE WARNING: Using an unspecified index. Your data will be downloaded and filtered on the client. Consider adding ".indexOn": "user1" at /members to your security rules for better performance. 

Вы также можете попытаться сохранить чаты каждого пользователя (в дополнение к тому, что у вас уже есть):

user1
  |
   -- chat1: true
   -- chat2: true

user2
  |
   -- chat2: true
   -- chat3: true

Тогда нужно просто запросить два пользовательских узла и проверить, не перекрываются ли они (чат2 вприведенный выше пример).Если количество чатов в вашем приложении растет без ограничений со временем, это решение будет работать лучше в долгосрочной перспективе.Надеемся, что количество чатов на пользователя намного меньше, чем общее количество активных чатов во всем приложении.

0 голосов
/ 06 сентября 2018

Да, вам осталось проверить их все. Я не думаю, что это будет проблемой, так как ваши чаты, вероятно, ниже 100k или около того.

Поскольку я не знаю, какую структуру данных вы используете, я просто пытаюсь сделать это на основе вашего изображения, и вы должны адаптироваться к вашей структуре.

// assuming a reasonable structure
let chats = [{name: "chat1", "1": true, "5": true}, {name: "chat2", "1": true, "2": true}];

function hasChat(chats, uid1, uid2) {
    return chats.find((chat) => {
        let uids = Object.keys(chat);
        return uids.indexOf(uid1) !== -1 && uids.indexOf(uid2) !== -1;
    }) !== undefined;
}

console.log(hasChat(chats, "1", "2"));

Это можно сделать более производительным и более читабельным с помощью библиотеки.

...