Как запросить документы, где содержится массив, а значение массива - ["val1", "val2"] Firestore - PullRequest
0 голосов
/ 26 марта 2020

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

Пример документа: я хотел бы знать, как запросить документ, в котором указаны бренды fiat и seat

{
   "name":"test 1",
   "brands":[
      {
         "brand":{
            "id":1,
            "name":"Fiat",
            "slug":"fiat",
            "image":null,
            "year_end":null,
            "year_start":null
         },
         "released_at":"2018-10-26"
      },
      {
         "brand":{
            "id":2,
            "name":"Seat",
            "slug":"seat",
            "image":null,
            "year_end":null,
            "year_start":null
         },
         "released_at":"2018-10-26"
      },
      {
         "brand":{
            "id":3,
            "name":"Mercedes",
            "slug":"mercedes",
            "image":null,
            "year_end":null,
            "year_start":null
         },
         "released_at":"2018-10-26"
      },
      {
         "brand":{
            "id":4,
            "name":"Yamaha",
            "slug":"yamaha",
            "image":null,
            "year_end":null,
            "year_start":null
         },
         "released_at":"2018-10-26"
      }
   ]
}

Я пробовал что-то вроде:

.collection("motors")
.where("brands.slug", "array-contains-any", ["fiat", "seat"])

но это не работает. Я не могу понять по документации , как это получить.

1 Ответ

0 голосов
/ 26 марта 2020

При использовании оператора array-contains-any вы можете сравнить значения вашего массива со значением свойства типа String и , а не массива. В настоящее время нет способа использовать оператор array-contains-any для массива. Есть два варианта, один из которых - создать два отдельных поля и создать два отдельных запроса, или, будучи только документом, вы можете получить весь документ и отфильтровать данные на клиенте.

Редактировать:

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

То, чего вы пытаетесь достичь, не работает с ваша текущая структура базы данных, потому что ваше свойство slug существует в объекте, который вложен в фактический объект, который существует в вашем массиве. Возможным решением также может быть дублирование некоторых данных и добавление в массив только нужных значений и использование оператора array-contains-any в этом новом созданном массиве.

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