Контекст: приложение NodeJs (meteorjs), подключенное к серверу MongoDB 4.0
У меня есть набор данных, которые я вычисляю довольно часто, и которые мне нужны для хранения времени, а затем доступа к определенному набору данных из моего приложения. Набор представляет собой массив из 12 000 объектов, конечный вес которого составляет около 3 МБ (измеряется с использованием статистики коллекции MongoDB для Коллекции только с одним набором данных: размер: 3,3 МБ; количество: 12964). Это связано с некоторыми параметрами вычислений. Мне нужно получить набор с помощью запроса.
Мне нужно выбрать между двумя структурами базы данных:
Вариант 1:
В одной коллекции хранятся ссылки на вычисления с идентификатором (назовем его ReferenceCollection
), а в другой коллекции - все 12000 объектов на вычисления, сохраненные в виде отдельных документов, и referenceId, указывающий на созданный ранее идентификатор.
Вот схематическое представление:
ReferenceCollection :
|--- _id: ObjectId("a")
|--- computation : "my reference"
ResultCollection :
|--- _id: ObjectId("b")
|--- referenceId : ObjectId("a")
|--- fieldResut1 : data
.
.
|--- fieldResut20 : data
Чтобы получить набор, я запросил бы referenceId в первой коллекции, используя параметры вычисления), затем запросил второй со ссылочным Id, чтобы получить 12 000 документов.
let reference = ReferenceCollection.findOne({computation: "my reference"}) // this is lightweight
let results = ResultCollection.find({referenceId: reference._id}) // this search for the 12 000 results
Вариант 2:
Одна коллекция, хранящая ссылки на вычисления с ключом, содержащим массив с данными внутри
Вот схематичное представление:
ResultCollection :
|--- _id: ObjectId("b")
|--- computation : "my reference"
|--- result : Array(
|--- fieldResut1 : data
.
.
|--- fieldResut20 : data
)
Чтобы получить набор, я бы сделал только один запрос с моими параметрами вычисления, чтобы получить один документ, содержащий все мои данные.
Проблема:
У меня возникают проблемы с производительностью при первом варианте: запрос и получение всех 12000 документов из настольного клиента MongoDB (студия 3T) довольно медленный: у меня 3 секунды. Второй вариант занимает всего 1 секунду для извлечения (это время включает загрузку данных). Это заставляет мое приложение долго ждать при получении данных.
Запросы из mongoshell на сервере выполняются очень быстро при возврате курсоров (около 20 мс для варианта 1).
Можете ли вы подтвердить, что вариант 2 является хорошим выбором для хранения этих данных?
Есть ли у меня другие варианты в отношении структуры данных?
Я запускаю MongoDB на одном узле. Считаете ли вы, что установка набора реплик может помочь улучшить производительность чтения?