Google Firestore: фильтровать документы, где вложенный ключ находится между заданным значением - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю над браузерной игрой, и у меня есть коллекция в firestore, которая выглядит так:

{
    title: "doc 1",
    requirements: {
        level: {
            min: 2,
            max: 3
        }
    }
},
{
    title: "doc 2",
    requirements: {
        level: {
            min: 6,
            max: 8
        }
    }
},
{
    title: "doc 3",
    requirements: {
        level: {
            min: 8,
            max: 9
        }
    }
}

Есть ли способ запросить все документы, которые соответствуют заданному уровню, например, когда у меня уровень 8, я хочу получить только документы "doc 2" и "doc 3", потому что требования к уровню соответствуют?

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

ref.where("requirements.level.min", "<=", level);
ref.where("requirements.level.max", ">=", level);

Я также пытался изменить структуру в моих документах следующим образом:

{
    title: "doc 1",
    requirements: {
        level: [2, 3]
    }
},
{
    title: "doc 2",
    requirements: {
        level: [6, 7, 8]
    }
}

и отфильтруйте это так

ref.where("requirements.level", "array-contains", level)

Но пожарный магазин всегда возвращает мне все документы.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Пожалуйста, попробуйте сделать structuur следующим образом

{
    title: "doc n",
    req_levels: [5, 6, 7]
}

Это упростит структуру данных. Теперь вы можете использовать простой запрос. Как объяснено здесь - https://firebase.google.com/docs/firestore/query-data/queries#compound_queries

townsRef.where ("регионов", "массив содержит", "west_coast")

В вашем случае уровень вар = 5; ref.where ("req_level", "array-contains", level)

0 голосов
/ 22 ноября 2018

Массив содержит, кажется, правильный выбор здесь. Я проверил ваш пример - воссоздал довольно похожую структуру в моем хранилище (другие документы имеют такую ​​же структуру, но уровни от 5 до 7) и запустил эти запросы:

const docs = firebase.firestore().collection('docs');
docs.where('requirements.levels','array-contains',2).get().then((snap) => {
    console.log(snap.docs.length); //<- outputs 1, correct
  });
docs.where('requirements.levels','array-contains',4).get().then((snap) => {
    console.log(snap.docs.length); //<- outputs 0, correct
  });
docs.where('requirements.levels','array-contains',5).get().then((snap) => {
    console.log(snap.docs.length); //<- outputs 1, correct
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...