Angular ключ Firebase pu sh на предмете - PullRequest
1 голос
/ 23 января 2020

Я новичок в angular и Firebase, и я чего-то не понимаю. Я хочу нарисовать картинку с уникальным ключом в моей базе данных. Теперь у меня есть массив url, и я отправляю его в свою базу данных следующим образом:

My db now

и вместо 0,1,2 я хочу получить sh уникальный идентификатор

мой код для pu sh данные:

export class SpotsService {
  spotsRef: AngularFireList<any>;
  spotRef: AngularFireObject<any>;
  spotiD: string;
  picsUrl: string[];
  picurl: string;

  constructor(private db: AngularFireDatabase) {
    this.picsUrl = [];
   }

  addSpot(spot: Spot){
    this.spotsRef.push({
      title: spot.title,
      synopsis: spot.synopsis,
      userId: spot.userId,
      markerLatLng: spot.markerLatLng,
      markerLatLngTwo: spot.markerLatLngTwo,
      photo: spot.photo,
      categories: spot.categories
    });
  }
}

мой интерфейс:

export interface Spot {
    $key: string;
    title: string;
    synopsis: string;
    userId: string;
    markerLatLng: number[];
    markerLatLngTwo: number[];
    photo: string[];
    categories: string[];
}

Если кто-то может мне помочь :) Огромное спасибо

Ответы [ 2 ]

1 голос
/ 23 января 2020

Поскольку photo объявлено как локальный массив (photo: string[];) в вашем коде JavaScript, Firebase запишет его как есть в базу данных.

Если вы хотите написать отдельные фотографии с pu sh идентификаторы, вам нужно будет записать их отдельно от других данных и вызвать push() для каждого из них:

let newRef = this.spotsRef.push({
  title: spot.title,
  synopsis: spot.synopsis,
  userId: spot.userId,
  markerLatLng: spot.markerLatLng,
  markerLatLngTwo: spot.markerLatLngTwo,
  categories: spot.categories
});
spot.photo.forEach((photo) => {
  newRef.child("photo").push(photo);
})

Вышеуказанное является самым простым, но приводит к нескольким операциям записи в базу данных. Чтобы получить тот же результат в одной операции записи, вы можете сделать что-то вроде:

let photos = {};
spot.photo.forEach((photo) => {
  photos[this.spotsRef.push().key] = photo;
})

this.spotsRef.push({
  title: spot.title,
  synopsis: spot.synopsis,
  userId: spot.userId,
  markerLatLng: spot.markerLatLng,
  markerLatLngTwo: spot.markerLatLngTwo,
  photo: photos,
  categories: spot.categories
});
0 голосов
/ 23 января 2020

Firebase Firestore и Realtime Database не позволяют настраивать ключи в полях массива. Для этого вам нужно создать в вашем документе под коллекцию изображений, в которой вы можете определить индивидуальный идентификатор для каждого изображения.

Пример:

galeries (collection)
  |_gallery_1 (document with custom id)
    -- title: Christmas (field)
    -- date: 12/25/2019 (field)
    -- photos: (collection)
      |_photo_1 (document with custom id)
        -- url: https://.../img.png (field)
      |_photo_2...

Для Firestore есть отличный учебник. Нет SQL Моделирование на Youtube, я настоятельно рекомендую: https://www.youtube.com/watch?v=jm66TSlVtcc

...