1

У меня есть массив javascript-объекта, который выглядит следующим образом.Сохранить массив объекта в firebase без получения 0,1,2 ... как ключ

jsObjFromCsv = 
[ 
    { 
     "J251525" : { 
      "APPROVER" : "[email protected]", 
      "JOB DESCRIPTION " : "CLEAN THE HOUSE", 
      "JOB NUMBER" : "J251525" 
     } 
    }, { 
     "J512912" : { 
      "APPROVER" : "[email protected]", 
      "JOB DESCRIPTION " : "BRUSH HORSE", 
      "JOB NUMBER" : "J512912" 
     } 
    }, { 
     "J5-512" : { 
      "APPROVER" : "[email protected]", 
      "JOB DESCRIPTION " : "WASH CAR", 
      "JOB NUMBER" : "J5-512" 
      } 
    } 
] 

Однако, когда я сохранить firebase используя следующий код он выглядит как этот

firebase screenshot -bad

saveJobToFirebase(jobs: Array<Object>) { 
    const jobCodesRef = this.af.database.list('/jobCodes/' + this.currentUser.company) 
    return jobCodesRef.push(jobs); 
} 

Я хочу, чтобы избавиться от 0,1,2 таким образом, что я могу конец запроса точки, как

jobCodes/Company1/-Kc8Q5Wuq4M91puQ_70J/J251525 

----------------- Моя попытка --------------

Я подумал о том, как это работает, но, похоже, это не так хорошо, как объяснялось в конце этого.

Так добиться того, что я хотел, я в первую очередь изменить массив объектов, чтобы быть следующим

[ 
    { 
     "APPROVER" : "[email protected]", 
     "JOB DESCRIPTION " : "CLEAN THE HOUSE", 
     "JOB NUMBER" : "J251525" 

    }, { 
     "APPROVER" : "[email protected]", 
     "JOB DESCRIPTION " : "BRUSH HORSE", 
     "JOB NUMBER" : "J512912" 

    }, { 
     "APPROVER" : "[email protected]", 
     "JOB DESCRIPTION " : "WASH CAR", 
     "JOB NUMBER" : "J5-512" 

    } 
] 

Тогда я Перебери каждый объект и захватить номер задания, чтобы получить конечную точку и непосредственно «SET "его к базе с кодом

saveJobToFirebase(jobs: Array<Object>) { 
    // previous code 
    // const jobCodesRef = this.af.database.list('/jobCodes/' + this.currentUser.company) 
    // return jobCodesRef.push(jobs); 

    // bad attempt? 
    for (let job of jobs) { 
     const jobCodesRef = this.af.database.object('/jobCodes/' + this.currentUser.company + '/' + job['JOB NUMBER']).set(job); 
    } 
} 

И это дает мне результат, который я хотел.

firebase screenshot-myattempt

Однако, есть две большие проблемы с этим методом

  1. мой saveJobToFirebase больше не возвращает thenableReference для меня, чтобы позвонить .then в моем компоненте. Это означает, что у меня не было бы способа отслеживать, было ли действие успешным

  2. Я не знаю, является ли обновление firebase с циклом for - хорошая идея? Что делать, если этот объект JSON имеет 2000 записей ... Я бы забил конечную точку, если я вызову ее внутри цикла for. Было бы лучше, если бы я мог «подтолкнуть» его так, чтобы все поступало с одним запросом?

ответ

1

0, 1, 2 и т. Д. Создаются, потому что вы сохраняете массив объектов. См. Это blog post about arrays in Firebase для получения дополнительной информации о том, почему такое поведение существует и почему Firebase рекомендует не хранить массивы.

Вызов push() будет генерировать так называемый push-идентификатор, значение, которое Firebase гарантирует уникальность. Но поскольку ваши рабочие места уже имеют свой собственный идентификатор, это тоже не нужно.

Структура, которую вы хотите, чтобы сохранить, кажется лучше: объекты имеют полезный ключ. Вы можете сохранить этот объект с:

jsObjFromCsv = { 
    "J251525" : { 
     "APPROVER" : "[email protected]", 
     "JOB DESCRIPTION " : "CLEAN THE HOUSE", 
     "JOB NUMBER" : "J251525" 
    }, 
    "J512912" : { 
     "APPROVER" : "[email protected]", 
     "JOB DESCRIPTION " : "BRUSH HORSE", 
     "JOB NUMBER" : "J512912" 
    }, 
    "J5-512" : { 
     "APPROVER" : "[email protected]", 
     "JOB DESCRIPTION " : "WASH CAR", 
     "JOB NUMBER" : "J5-512" 
     } 
}; 

Если вы внимательно посмотрите, то увидите, что я удалил массив и внешний уровень объектов.

Теперь вы можете сохранить этот объект с:

const jobCodesRef = this.af.database.list('/jobCodes/' + this.currentUser.company) 
jobCodesRef.update(jsObjFromCsv); 

возвращения значения из update() является thennable, так что вы можете продолжать, когда действие завершено (или не удалось).

+0

Еще раз спасибо Frank. Мне также пришлось перейти к this.af.databse.object, чтобы заставить его работать. Но отличное решение и детализация! ура – user172902

0

У меня была аналогичная проблема, но в узле и ответов не оказалось достаточно. Я знаю, что ваш код отличается, но принцип тот же. Надеюсь, это поможет кому-то в будущем. Первая Firebase может сохранять данные по-разному, например push или set. Нажимайте, когда массивы с квадратными скобками автоматически добавляются в числа, такие как 0, 1, 2, так что говорят, что два человека публикуются в блоге, в то же время они не перезаписывают друг друга. Set игнорирует это и перезаписывает все на пути, чтобы сохранить данные, как вы указали.

В моем случае я добавлял объекты json к массиву с .push и получал 0, 1, 2 и мне нужны имена вместо 0, 1, 2, поэтому я в основном просто переключил массив на объект, а вместо using .push Я устанавливаю объекты внутри одного большого объекта. Чтобы проиллюстрировать это:

Что я первым:

var array = []; 
jsonobject={ 
title:'title' 
} 

array.push(jsonobject); 
//then I used push to firebase that array in an advanced method 

Исправление:

var mybigjson = {}; 
var nameiwantinsteadofnumbers = [insert your changing variable for each jsonobject here] 
jsonobject={ 
title:'title' 
} 

mybigjson[nameiwantinsteadofnumbers]=jsonobject 
//then I used push to firebase that object in an advanced method