Ограничение длины строкового параметра startAt () базы данных Firebase? - PullRequest
0 голосов
/ 03 июля 2018

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

Так есть ли ограничение длины строки для параметра при использовании startAt() для получения данных из базы данных firebase?

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

Если это действительно предел, то есть ли способ изменить его? (Мне нужно иметь возможность фильтровать по значениям до 60 символов)

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

Я использую js sdk на случай, если это имеет значение.

Набор данных (каждое значение имеет длину около 100 символов, и первые 41 символ идентичны в каждом из них, но отсрочиваются в хвостах)

{
  "obj1": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"},
  "obj2": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"},
  "obj3": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_23456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"},
  "obj4": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_3456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"},
  "obj5": {"param": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF"}
}

Теперь мне нужно получить «obj1» по значению ключа «param», и я знаю только первые 60 его символов (поэтому я не могу использовать equalTo ())

var ref = firebase.database().ref("/some/data");

ref.orderByChild("param")
   .startAt("abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabc") <- this guy is 60 characters long
   .once("value")
   .then(function(snapshot) {
     snapshot.forEach(function(child) {
       console.log(child.key);
     });
   })

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Похоже, вы запутались в операции startAt и пытаетесь использовать ее для фильтрации строк, начинающихся с определенной подстроки. Однако startAt работает не так.

Когда вы упорядочиваете дочерние элементы по значению param, Firebase упорядочивает всех дочерних по значению этого свойства. Когда вы начинаете с abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabc, он начинает возвращать узлы с этого момента. И в этом порядке abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF идет после abcdefghijklmnopqrstuvwxyz0123456789ABCDEF_0123456789ABCDEFabc.

Если вы хотите, чтобы первый ребенок начинал с определенного значения, рассмотрите возможность использования .startAt(searchTerm).limitToFirst(1).

Если вы хотите, чтобы дети начинали с с определенным значением, используйте закрытый диапазон startAt(searchTerm).endAt(searchTerm+"\uf8ff"). Здесь \uf8ff - последний символ Юникода.

0 голосов
/ 04 июля 2018

Я только что попытался воспроизвести эту проблему в проекте JavaScript и в проекте Swift, но не смог.

Мой набор данных:

{
  "key1" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
  "key2" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFZHIJKLMNOPQRSTUVWXYZ0123456789",
  "key3" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFHHIJKLMNOPQRSTUVWXYZ0123456789",
  "key4" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFIHIJKLMNOPQRSTUVWXYZ0123456789",
  "key5" : "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFJHIJKLMNOPQRSTUVWXYZ0123456789"
}

Мой код JavaScript:

var ref = firebase.database().ref("/51151783");

ref.orderByValue()
   .startAt("abcdefghijklmnopqrstuvwxyz0123456789ABCDEFI")
   .once("value")
   .then(function(snapshot) {
     snapshot.forEach(function(child) {
       console.log(child.key);
     });
   })

Мой код Swift:

func searchForLongValue51151783() {
    let ref = Database.database().reference(withPath: "51151783")
    ref.queryOrderedByValue().queryStarting(atValue: "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFI").observeSingleEvent(of: .value, with: { (snapshot) in
            for child in snapshot.children {
                print((child as! DataSnapshot).key)
            }
    })
}

Это выводит:

Key4

key5

key2

И jsbin: http://jsbin.com/lupebuwihu/edit?js,console.

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