База данных Firebase Realtime: orderByChild (). EqualTo () на вложенности 4-го уровня - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь выполнить запрос к базе данных Firebase в реальном времени, чтобы отфильтровать данные на основе значения, вложенного на 4-м уровне от root.Ниже приведена структура данных, и мой запрос:

let ordersSnapshot = await admin.database().ref(`orders`).orderByChild(`info/infoStatus`)
            .equalTo("In Process")
            .once('value');

Но этот запрос не возвращает данных.Я включил индексирование, и для него нет предупреждений.Я также изменил свой запрос на .orderByChild('infoStatus'), но безрезультатно.

Если я установлю свой реф на один уровень ниже, то есть admin.database().ref('orders/userId1').orderByChild('info/infoStatus').equalTo("In Process"), тогда он получит результат успешно.Но в моем сценарии у меня нет идентификатора пользователя, который я мог бы использовать в orderByChild.

Это ограничение запроса к базе данных в реальном времени, т.е. мне нужно обновить структуру данных или есть какая-либо ошибка в моемзапрос?

Узел заказов:

{
    "userId1": {
        "orderId1": {
            "info": {
                "infoStatus": "In Process"
            }
        },
        "orderId2": {
            "info": {
                "infoStatus": "Complete"
            }
        }
    },
    "userId2": {
        "orderId1": {
            "info": {
                "infoStatus": "In Process"
            }
        }
    },
    "userId3": {
        "orderId1": {
            "info": {
                "infoStatus": "In Process"
            }
        }
    }


}

1 Ответ

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

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

Типичным решением является сглаживание данных, сохранение заказов в едином списке и добавление списка идентификаторов заказов для каждого пользователя, если это все еще необходимо. Что-то вроде:

users: {
    "userId1": {
        "orderId1": true,
        "orderId2": true
    },
    "userId2": {
        "orderId3": true
    }
    "userId3": {
        "orderId4": true
    }
}
orders: {
    "orderId1": {
        "info": {
            "infoStatus": "In Process"
        }
    },
    "orderId2": {
        "info": {
            "infoStatus": "Complete"
        }
    },
    "orderId3": {
        "info": {
            "infoStatus": "In Process"
        }
    },
    "orderId4": {
        "info": {
            "infoStatus": "In Process"
        }
    }
}

Также см .: Запрос Firebase с двойным вложением

...