Наполнение базы данных из json файлов

Осваиваю Метеор. Был бы благодарен, если бы знающие подсказали как правильнее справиться с задачей.

Допустим, у нас есть пустая база данных Mongo. В корне проекта, в папке lib при запуске приложения создается инстанс коллекции (внутри ничего нет пока, ведь база пустая). Нужно сделать так, чтобы обнаружив пустую коллекцию, база данных автоматически наполнилась содержимым JSON файлов из папки data. В идеале было бы также не писать вручную запросы к каждому файлу (их количество и имена могут меняться со временем, соответственно мы не знаем сколько их и какие у них имена), а парсить все файлы из папки.

Таким образом, представляю себе алгоритм примерно такой:

  1. Создали инстанс коллекции перед началом работы.
  2. Проверили, он пустой. Понятно, значим идем дальше.
  3. Смотрим в папку data, пушим в массив имена всех файлов из этой папки.
  4. Итерируем по массиву имен файлов, в каждой итерации запрашиваем содержимое файла и вставляем его в коллекцию (структура JSON файла неважна).
  5. Профит, коллекция наполнена.

Кое что из легенды:

  • База данных часто обнуляется.
  • Нужен способ быстрого наполнения базы данных контентом.
  • Контент хранится в JSON файлах.
  • Хардкодить имена JSON файлов при запросе — не вариант, файлов может быть очень много.
  • Превращать JSON в JS файлы и записывать всю структуру в переменную для дальнейшего обращения — тоже не хотелось бы.

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

Укажи полный путь к папке где будут лежать JSON-ы с помощью настройки. В примере я храню путь к папке в свойстве dbFilesFolder


хранить файлы настройки нужно в папке private

запускай метеор с этими настройками

meteor --settings ./private/dev.json

и деплой с настройками для продакшена

meteor deploy --settings ./private/prod.json

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


Не забудь проверку на админа в методе чтобы его не дергал кто попало. Вызывай с клиента метод когда надо обновить содержимое коллекции. Или вызывай функицю заполнения коллекции по таймеру

import { Meteor} from 'meteor/meteor'
import {coll} from '../collection'

const fs = require('fs')
const path = require('path')

function fillCollectionWithDataFromFolder(collection) {
	// Получаем абсолютный путь к папке с данными для коллекции
	const fullPathToDataFolder = path.resolve(Meteor.settings.dbFilesFolder)
	// Тут возможно ты захочешь отфильтровать только JSON файлы. Я предполагаю что
	// все содержимое папки - json файлы. + я не заморачивался с асинхронной обработкой файлов, а тебе стоило бы
	// иначе запросы к серверу будут тормозить когда данные выгружаются в коллекцию
	const folderFilesList = fs.readdirSync(fullPathToDataFolder)
	folderFilesList.forEach(fileName => {
		// Тут нужны проверки и обработка ошибок
		const fileContents = JSON.parse(fs.readFileSync(path.resolve(fullPathToDataFolder, fileName)))
		collection.insert(fileContents)
	})
}

function refillCollection(collection) {
	// Удаляем все содержимое коллекции, заполняем содержимым файлов из папки
	collection.remove({}, () => {
		fillCollectionWithDataFromFolder(collection)
	})
}

Meteor.methods({
	refill() {
		// Тут должны быть проверки что пользователь - админ
		refillCollection(coll)
	}
})

Meteor.startup(() => {
  if (!coll.findOne()) {
  	// Начальное наполнение
  	fillCollectionWithDataFromFolder(coll)
  }
});
1 лайк

Блестяще, то что нужно. Спасибо.