Я пытаюсь увеличить свой Cloud Firestore с помощью REST API, однако в документации неясно, как это работает. Вот моя текущая реализация: -
Я пытаюсь увеличить целочисленное значение «c» на 2, поэтому, если сохраненное значение сервера равно 10, я хочу, чтобы при этом оно стало 12. Пожалуйста помоги.
{
"writes": [
{
"currentDocument": {
"exists": true
}
},
{
"transform": {
"document": "projects/project_name/databases/(default)/documents/collection_name/user_id",
"fieldTransforms": [
{
"increment": {
"c": {
"integerValue": "2"
}
}
}
]
}
}
]
}
Ошибка, которую я продолжаю получать: -
{
"error": {
"code": 400,
"message": "Invalid JSON payload received. Unknown name \"\": Root element must be a message.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"description": "Invalid JSON payload received. Unknown name \"\": Root element must be a message."
}
]
}
]
}
}
Обновлено: вот ошибка после исправления моей полезной нагрузки:
{
"error": {
"code": 400,
"message": "Invalid JSON payload received. Unknown name \"writes\" at 'document': Cannot find field.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "document",
"description": "Invalid JSON payload received. Unknown name \"writes\" at 'document': Cannot find field."
}
]
}
]
}
}






В соответствии с FieldTransform документация вы должны установить fieldPath в своем представлении JSON. Вот список возможных типов для поля объединения transform_type:
{
"fieldPath": string,
// Union field transform_type can be only one of the following:
"setToServerValue": enum (ServerValue),
"increment": {
object (Value)
},
"maximum": {
object (Value)
},
"minimum": {
object (Value)
},
"appendMissingElements": {
object (ArrayValue)
},
"removeAllFromArray": {
object (ArrayValue)
}
// End of list of possible types for union field transform_type.
}
Вы должны удалить fieldPath, который находится внутри приращения:
"fieldTransforms": [
{
"increment": {
"c": {
"integerValue": "2"
}
}
}
]
и измените его на эту структуру:
"fieldTransforms": [
{
"fieldPath": "<FieldName>",
"increment": {
"integerValue": "2"
}
}
]
А также просто хочу отметить, что c и currentDocument должны быть внутри объектов transform. Для справки, вот полное представление writes, основанное на приведенном выше представлении JSON:
{
"writes": [
{
"currentDocument": {
"exists": true
},
"transform": {
"document": "projects/project_name/databases/(default)/documents/collection_name/user_id",
"fieldTransforms": [
{
"fieldPath": "c",
"increment": {
"integerValue": "2"
}
}
]
}
}
]
}
Вот результат использования Postman:

Для получения дополнительной информации вы можете проверить Firebase REST API: запись.
@Arnav, ты правильно понял значение "document"? "document": "проекты/<project_name>/базы данных/(по умолчанию)/документы/<collection_name>/<document_name>". Если да, не могли бы вы также включить в свой вопрос полный воспроизводимый код. Просто замаскируйте конфиденциальную информацию, если это возможно.
Проверьте скриншот, который я добавил в свой опубликованный ответ выше. Я использовал Postman для тестирования REST API.
Ага, понятно. Я предполагаю, что вы используете эту конечную точку: https://firestore.googleapis.com/v1/projects/<project-id>/databases/(default)/documents/*/:commit
Рад, что теперь это сработало с вашей стороны.
Привет, Марк, не могли бы вы также рассмотреть этот вопрос - stackoverflow.com/questions/71723641/…
Я также обновил свой вопрос. Пожалуйста, посмотрите :)