Запрос Firebase для определенного значения [duplicate]

Я согласен, что правильный инструмент для синтаксического анализа XML и , особенно HTML , является синтаксическим анализатором, а не механизмом регулярных выражений. Однако, как указывали другие, иногда использование регулярного выражения выполняется быстрее, проще и выполняется, если вы знаете формат данных.

Microsoft фактически имеет раздел Рекомендации по регулярным выражениям в .NET Framework и, в частности, говорит о . Рассмотрим [вход] источника входного сигнала .

Регулярные выражения имеют ограничения, но вы считали следующее?

.NET framework уникален, когда речь заходит о регулярных выражениях в том, что он поддерживает Определения балансировочной группы .

По этой причине я считаю, что вы можете анализировать XML с помощью регулярных выражений. Обратите внимание, однако, что он должен быть достоверным. XML ( браузеры очень прощают HTML и допускают плохой синтаксис XML внутри HTML ). Это возможно, так как «Определение балансировки группы» позволит механизму регулярных выражений действовать как КПК.

Цитата из статьи 1, процитированной выше:

.NET Regular Expression Двигатель

Как описано выше, правильно сбалансированные конструкции не могут быть описаны регулярным выражением. Тем не менее, механизм регулярного выражения .NET предоставляет несколько конструкций, которые позволяют распознавать сбалансированные конструкции.

  • (?) - выталкивает захваченный результат в стек захвата с помощью группы имен.
  • (?<-group>) - отображает верхний захват с группой имен с захвата stack.
  • (?(group)yes|no) - соответствует дате, если существует группа с группой имен, в противном случае не соответствует какой-либо детали.

Эти конструкции допускают регулярную .NET выражение для подражания ограниченному КПК, по существу позволяя простые версии операций стека: push, pop и empty. Простые операции в значительной степени эквивалентны приращению, уменьшению и сравнению с нулем соответственно. Это позволяет механизму регулярного выражения .NET распознавать подмножество контекстно-свободных языков, в частности тех, которые требуют простого счетчика. Это, в свою очередь, позволяет нетрадиционным регулярным выражениям .NET распознавать индивидуально правильно сбалансированные конструкции.

Рассмотрим следующее регулярное выражение:

(?=)
(?>
                     |
   <[^>]*/>                      |
   (?<(?!/)[^>]*[^/]>)  |
   (?<-opentag>]*[^/]>)     |
   [^<>]*
)*
(?(opentag)(?!))

Использовать флаги :

  • Singleline
  • IgnorePatternWhitespace (необязательно, если вы сбрасываете регулярное выражение и удаляете все пробелы)
  • IgnoreCase (необязательно)

Объяснение регулярного выражения (inline)

(?=) # match start with 
    # atomic group / don't backtrack (faster) | # match xml / html comment <[^>]*/> | # self closing tag (?<(?!/)[^>]*[^/]>) | # push opening xml tag (?<-opentag>]*[^/]>) | # pop closing xml tag [^<>]* # something between tags )* # match as many xml tags as possible (?(opentag)(?!)) # ensure no 'opentag' groups are on stack

Вы можете попробовать это на A Better .NET Regular Expression Tester .

Я использовал источник выборки:




  • stuff...
  • more stuff
  • still more
    • Another >ul<, oh my!
    • ...

Это нашло совпадение:

   
  • stuff...
  • more stuff
  • still more
    • Another >ul<, oh my!
    • ...

, хотя оно получилось так:

  • stuff...
  • more stuff
  • still more
    • Another >ul<, oh my!
    • ...

Наконец, Мне очень понравилась статья Джеффа Этвуда: Parsing Html Путь Ктулху . Забавно, он цитирует ответ на этот вопрос, который в настоящее время имеет более 4 кв голосов.

20
задан koceeng 23 February 2017 в 09:54
поделиться

2 ответа

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

const db = firebase.database()
const usersRef = db.ref('users')
const query = usersRef.orderByChild('blogs/efg').limitToLast(1)
query.once('value').then((ss) => {
  console.log(ss.val()) //=> { '7654321': { blogs: {...}}}
})

Вам нужно использовать limitToLast, поскольку объекты сортируются последними при использовании orderByChild документы .

0
ответ дан Bryan Massoth 16 August 2018 в 00:29
поделиться

API Firebase позволяет только фильтровать детей на один уровень (или с известным путем ) с помощью методов orderByChild и equalTo.

Таким образом, без изменения / расширяя вашу текущую структуру данных, которая просто оставляет возможность извлекать все данные и фильтровать их на стороне клиента:

var ref = firebase.database().ref('Users');
ref.once('value', function(snapshot) {
    snapshot.forEach(function(userSnapshot) {
        var blogs = userSnapshot.val().blogs;
        var daBlog = blogs['efg'];
    });
});

Это, конечно, крайне неэффективно и не будет масштабироваться, если у вас нетривиальный количество пользователей / блогов.

Таким образом, общим решением этого является так называемый индекс вашего дерева, который отображает ключ, который вы ищете, к пути, в котором он находится:

{Blogs:
     "abc": "1234567",
     "zyx": "1234567",
     "efg": "7654321",
     "hij": "7654321"
}

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

var ref = firebase.database().ref();
ref.child('Blogs/efg').once('value', function(snapshot) {
    var user = snapshot.val();
    ref.child('Blogs/'+user+'/blogs').on('value, function(blogSnapshot) {
        var daBlog = blogSnapshot.val();
    });
});

Возможно, вам также захочется пересмотреть, если вы можете реструктурировать свои данные, чтобы лучше соответствовать ограничениям использования и Firebase. У них есть хорошая документация по структурированию ваших данных, но самая важная для людей, не знакомых с NoSQL / иерархическими базами данных, кажется «избегать построения гнезд» .

Также см. Мой ответ on Запрос Firebase, если для дочернего элемента child [] значение # / g2 для хорошего примера.

24
ответ дан Frank van Puffelen 16 August 2018 в 00:29
поделиться
  • 1
    – denisjacquemin 14 August 2015 в 18:26
  • 2
  • 3
    Я подумал об этом несколько минут, но сдаюсь: как бы глубокий запрос разрешил эту проблему? – Frank van Puffelen 10 October 2015 в 05:31
  • 4
    Я не думаю, что глубокий запрос решает проблему; но в сообщении говорится, что вы можете запросить только одноуровневую глубину, что уже не так. – Kato 29 October 2015 в 20:57
  • 5
    @FrankvanPuffelen, я читал много ваших ответов в последнее время (вы, кажется, единственный, кто знает что-нибудь о firebase [видя, как вы являетесь инженером firebase]), и мне интересно, если вы окончательное решение в своем ответ - это лучшая практика, или мы всегда должны пытаться структурировать информацию, чтобы мы могли сделать только один звонок? – ntgCleaner 24 July 2017 в 03:55
Другие вопросы по тегам:

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