Как запросить документы, содержащие массив объектов в коллекции Firestore, используя фильтр whereArrayContains () на Android? - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть коллекция в firestore, где каждый документ содержит массив контактов, и я хочу запросить те документы, в которых идентификатор электронной почты любого контакта имеет определенное значение.

Я сталкивался с фильтром whereArrayContains () на https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#whereArrayContains(java.lang.String,%20java.lang.Object), со следующим описанием: -

public Query whereArrayContains (поле String, значение объекта) Создает и возвращает новый запрос с дополнительным фильтром, в котором документы должны содержать указанное поле, значение должно быть массивом, а массив должен содержать предоставленное значение.

Запрос может иметь только один метод whereArrayContains ()filter.

Может ли value в вышеприведенном методе указывать на поле внутри объекта для массива объектов?

Кроме того, фраза the value must be an array немного сбивает с толку, учитывая, что параметр метода также называется value.Я уверен, что документация означает, что field должен присутствовать в документе, а его значение должно быть массивом и что массив должен содержать параметр value.

Ответы [ 2 ]

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

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

значение должно быть массивом

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

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

Если вы пытаетесь отфильтровать идентификатор пользователя или что-то подобное, рассмотрите возможность добавления второго массива к запрашиваемому объекту, а затем добавления идентификаторов в виде строк в этот массив:

{
    "name": "test",
    "users": [someUserObject, someOtherUserObject],
    "userIds": ["someId", "someOtherId"]
}

затем запросите этот массив вместо:

someRef.whereArrayContains("userIds", someId);
0 голосов
/ 16 сентября 2018

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

Вы можете использовать оператор array_contains для фильтрации на основе массиваценности.Например:

CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");

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

Данные добавляются как: -

CollectionReference cities = db.collection("cities");

Map<String, Object> data1 = new HashMap<>();
data1.put("name", "San Francisco");
data1.put("state", "CA");
data1.put("country", "USA");
data1.put("capital", false);
data1.put("population", 860000);
data1.put("regions", Arrays.asList("west_coast", "norcal"));
cities.document("SF").set(data1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...