Если product1
и product2
являются документами в коллекции (скажем, products
), то вы можете выбрать, например, все продукты, доступные в серебре, с:
let productsRef = firebase.firestore().collection('products');
productsRef.where("allAtributes.Color", "array-contains", "silver")
. Приведенный выше запрос использует array-contains
предложение .
. Вы также можете выбрать все продукты, которые доступны в серебристом или черном цвете:
productsRef.where("allAtributes.Color", "array-contains-any", ["silver", "black"])
Это так называемое предложение array-contains-any
может:
использовать оператор array-contains-any
для объединения до 10 array-contains
предложений в одном поле с логическим ИЛИ.
Вы можете выполнить вышеуказанные пункты запроса для любого из полей в allAttributes
. Но вы можете сделать это предложение только на одном поле. Из документации об ограничениях запросов :
Вы можете использовать только одно предложение in
или array-contains-any
на запрос. Вы не можете использовать как in
, так и array-contains-any
в одном запросе.
Таким образом, вы можете запросить все продукты, которые доступны в серебристом или черном цвете, и вы можете запросить все продукты из GoPro, но вы не можете запрашивать приложения GoPro, которые доступны в серебристом или черном цвете.
Если вы сохраните марку как однозначное поле, например:
"allAttributes": {
...
brand: "GoPro"
}
С приведенной выше структурой вы сможете сделать запрос следующим образом:
productsRef
.where("allAtributes.brand", "==", "GoPro")
.where("allAtributes.Color", "array-contains-any", ["silver", "black"])
Чтобы получить все продукты GoPro, которые доступны в серебристом или черном цвете, но, конечно, в этот момент каждый продукт может быть только одного бренда.
Если ваш вариант использования абсолютно требуются типы запросов, которые невозможны в Firestore, рассмотрите возможность объединения или замены Firestore другой базой данных.