Хранение базы данных JSON в Cloud Firestore с пользовательским идентификатором подпапок - PullRequest
0 голосов
/ 01 марта 2019

В Firestore мне удалось сохранить свою большую базу данных JSON с помощью первого решения этого потока (код, на который я ссылаюсь, находится ниже по ссылке): Как импортировать CSV или JSON в Firebase Cloud Firestore.

const admin = require('../functions/node_modules/firebase-admin');
const serviceAccount = require("./service-key.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://<your-database-name>.firebaseio.com"
});

const data = require("./fakedb.json");

/**
 * Data is a collection if
 *  - it has a odd depth
 *  - contains only objects or contains no objects.
 */
function isCollection(data, path, depth) {
  if (
    typeof data != 'object' ||
    data == null ||
    data.length === 0 ||
    isEmpty(data)
  ) {
    return false;
  }

  for (const key in data) {
    if (typeof data[key] != 'object' || data[key] == null) {
      // If there is at least one non-object item then it data then it cannot be collection.
      return false;
    }
  }

  return true;
}

// Checks if object is empty.
function isEmpty(obj) {
  for(const key in obj) {
    if(obj.hasOwnProperty(key)) {
      return false;
    }
  }
  return true;
}

async function upload(data, path) {
  return await admin.firestore()
    .doc(path.join('/'))
    .set(data)
    .then(() => console.log(`Document ${path.join('/')} uploaded.`))
    .catch(() => console.error(`Could not write document ${path.join('/')}.`));
}

/**
 *
 */
async function resolve(data, path = []) {
  if (path.length > 0 && path.length % 2 == 0) {
    // Document's length of path is always even, however, one of keys can actually be a collection.

    // Copy an object.
    const documentData = Object.assign({}, data);

    for (const key in data) {
      // Resolve each collection and remove it from document data.
      if (isCollection(data[key], [...path, key])) {
        // Remove a collection from the document data.
        delete documentData[key];
        // Resolve a colleciton.
        resolve(data[key], [...path, key]);
      }
    }

    // If document is empty then it means it only consisted of collections.
    if (!isEmpty(documentData)) {
      // Upload a document free of collections.
      await upload(documentData, path);
    }
  } else {
    // Collection's length of is always odd.
    for (const key in data) {
      // Resolve each collection.
      await resolve(data[key], [...path, key]);
    }
  }
}

resolve(data);

Проблема в том, что я хочу получить данные с "идентификатором" из моего углового приложения из Firestore.Прямо сейчас, подпапки, которые были созданы в Firestore, идут от 0 до n.Вместо этого я хочу назначить «id» объектов массива в качестве имен подпапок в Firestore.Это общий вопрос JavaScript, я думаю.Я просто не знаком с синтаксисом, используемым в предоставленном коде.Я также давно не пишу и надеюсь, что кто-нибудь может мне помочь.

Это структура моей базы данных JSON

{
    "customCollection": [{
            "p": "6",
            "c": "",
            "m": 0.1,
            "id": "60.1" //this id should be the subfolder's name in Firestore
        },
        {
            "p": "5",
            "c": "",
            "m": 0.1,
            "id": "50.1"
        }]
   }

Так что в Firestore структура должна быть:

customCollection -> 60.1 -> данные первого объекта

customCollection -> 50.1 -> данные второго объекта

вместо:

customCollection ->0 -> данные первого объекта

customCollection -> 1 -> данные второго объекта

Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 12 марта 2019

Решение этого вопроса было предоставлено "rgrcnh" в ссылке, которую я разместил:

Это небольшая модификация, которая копирует идентификатор документа, если он существует, в его путь,В противном случае он будет использовать индекс "for".

...   ...   } else {
    // Collection's length of is always odd.
    for (const key in data) {
      // Resolve each collection.
      if (data[key]['id']!==undefined)
        await resolve(data[key], [...path,data[key]['id']])
      else 
        await resolve(data[key], [...path, key]);
    }   } }

resolve(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...