Вложенный запрос в Firebase Firestore - PullRequest
0 голосов
/ 17 марта 2020

У меня есть структура базы данных Firestore, подобная этой: (Articles - это коллекция, все внутри - это массивы)

Articles:
[
    {
        "id": 1,
        "reports": [
            {
                "locations": [
                    {
                        "location": "Sydney",
                        "country": "Australia"
                    },
                    {
                        "location": "Perth",
                        "country": "Australia"
                    }
                ],
            },
            {
                "locations": [
                    {
                        "location": "King County, Washington",
                        "country": "USA"
                    }
                ],
            }
        ]
    },
    {
        "id": 2,
        "reports": [
            {
                "locations": [
                    {
                        "location": "Brisbane",
                        "country": "Australia"
                    }
                ]
            }
        ]
    }
]

Я хотел бы создать запрос для возврата всех статей, в которых указан конкретный c страна. Мне лучше реструктурировать мою базу данных?

1 Ответ

1 голос
/ 17 марта 2020

Хотя запросы Firestore array-contains могут приблизить вас к этому, вы не можете использовать их в своей текущей модели данных, поскольку вы вкладываете массивы.

Чтобы разрешить сценарий использования, вам, по крайней мере, потребуется развернуть один из этих массивов во вложенную коллекцию каждой статьи, поэтому:

Articles (collection)
  $article
    reports (collection)
      $report (document with a locations array)

В этот момент вы можете использовать запрос группы коллекций для поиска во всех reports коллекциях, а затем array-contains для поиска соответствующих документов отчета:

var ref = firebase.firestore().collectionGroup("reports");
ref.where("locations", "array-contains", { location: "Sydney", country: "Australia" })

Не берите в голову приведенный ниже ответ, который предполагает, что у вас был только один уровень массив ...

Этот тип запроса должен быть возможен, насколько я вижу, с использованием оператора array-contains. Имея в виду, что вам нужно указать весь элемент массива.

Так что-то вроде:

collectionRef.where("reports.locations", "array-contains", 
                        { location: "Sydney", country: "Australia" })

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