Фильтрация данных с помощью правил .indexOn в базе данных реального времени Firebase с AngularJS - PullRequest
0 голосов
/ 22 апреля 2019

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

FireBase

{
  "models": {
    "model1": {
      "modelName": "model 1",
      "color": {
        "red": true,
        "blue": true,
        "green": true
      }
    },
    "model2": {
      "modelName": "model 2",
      "color": {
        "yellow": true,
        "blue": true,
        "green": true
      }
    },
    "model3": {
      "modelName": "model 3",
      "color": {
        "red": true,
        "yellow": true,
        "pink": true
      }
    },
    "model4": {
      "modelName": "model 4",
      "color": {
        "red": true,
        "orange": true,
        "white": true
      }
    }
  }
}

Я пытался использовать приведенный ниже запрос, но не получил ожидаемогорезультат.

AngularJS

let fbRef = firebase.database().ref('models');

fbRef
    .orderByChild('red')
    .equalTo(true)
    .once('value', function(data){
      console.log('result : ', data);
    });

Правила FireBase

{
  "rules": {
    ".read": true,

    "$modelID": {
      ".read": true,
      ".indexOn": ["red", "blue", "green", "orange", "pink", "white", "yellow"]
    }

  }
}

Ожидаемые результаты

{
  "model1": {
    "modelName": "model 1",
    "color": {
      "red": true,
      "blue": true,
      "green": true
    }
  },
  "model3": {
    "modelName": "model 3",
    "color": {
      "red": true,
      "yellow": true,
      "pink": true
    }
  },
  "model4": {
    "modelName": "model 4",
    "color": {
      "red": true,
      "orange": true,
      "white": true
    }
  }
}

1 Ответ

1 голос
/ 22 апреля 2019

Вы должны заказать по 'color/red' следующим образом:

  fbRef
    .orderByChild('color/red')
    .equalTo(true)
    .once('value', function(data) {
      //Use the val() method of the DataSnapshot
      console.log('result : ', data.val());
      //Or loop over children
      data.forEach(function(childSnapshot) {
        var childKey = childSnapshot.key;
        var childData = childSnapshot.val();
        console.log('childKey : ', childKey);
        console.log('childData : ', childData);
      });
    });

Поскольку вы получаете DataSnapshot, вы можете использовать val() метод для получения результата в виде объекта или использование forEach() для «перечисления дочерних элементов верхнего уровня в DataSnapshot».Одно из различий между этими двумя способами заключается в том, что «порядок данных в объекте JavaScript, возвращаемый val(), не обязательно соответствует порядку на сервере», как объяснено в документе.

...