Внедренные документы MongoDB: ограничение размера и производительность агрегирования - PullRequest
1 голос
/ 21 января 2020

В документации MongoDB предлагается разместить как можно больше данных в одном документе. Также предлагается НЕ использовать вложенные документы на основе ObjectId ref , если на данные этих вложенных документов не нужно ссылаться из более чем одного документа.

В моем случае у меня есть отношение один ко многим , подобное этому:

Журнал схема:

const model = (mongoose) => {
    const LogSchema = new mongoose.Schema({
        result: { type: String, required: true },
        operation: { type: Date, required: true },
        x: { type: Number, required: true },
        y: { type: Number, required: true },
        z: { type: Number, required: true }
    });
    const model = mongoose.model("Log", LogSchema);
    return model;
};

Машина схема:

const model = (mongoose) => {
    const MachineSchema = new mongoose.Schema({
        model: { type: String, required: true },
        description: { type: String, required: true },
        logs: [ mongoose.model("Log").schema ]
    });
    const model = mongoose.model("Machine", MachineSchema);
    return model;
};
module.exports = model;

Каждый Машина будет иметь много Production_Log документов (более одного миллиона). Используя встроенные документы, я очень быстро набрал ограничение в 16 МБ на документ во время своих тестов и не смог добавить больше документов Production_Log в документы Machine .

Мои сомнения

  1. Это тот случай, когда следует использовать поддокументы в качестве ObjectId ссылок вместо встроенных документов?

  2. Есть ли какое-либо другое решение, которое я мог бы оценить?

  3. Я буду получать доступ к Production_Log документам для создания статистики для каждой Машины используя структуру агрегации. Должен ли я иметь какие-либо дополнительные соображения по поводу дизайна схемы?

Заранее большое спасибо за ваш совет!

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Нормализация базы данных неприменима к MongoDB

MongoDB лучше масштабируется, если хранить полную информацию в одном документе (избыточность данных). Нормализация базы данных обязывает разделять данные в разных коллекциях, но если их увеличить, это приведет к проблемам с узкими местами.

Использовать только LOG Схема:

const model = (mongoose) => {
    const LogSchema = new mongoose.Schema({
        model: { type: String, required: true },
        description: { type: String, required: true },
        result: { type: String, required: true },
        operation: { type: Date, required: true },
        x: { type: Number, required: true },
        y: { type: Number, required: true },
        z: { type: Number, required: true }
    });
    const model = mongoose.model("Log", LogSchema);
    return model;
};

Операция чтения / записи отлично масштабируется в таким образом.

С помощью Агрегирование вы можете обрабатывать данные и вычислять желаемый результат.

0 голосов
/ 21 января 2020

Пожалуйста, посмотрите, подходит ли вам этот подход

В коллекции Log будет создано больше данных, тогда как коллекция Machine никогда не превысит 16 МБ. Вместо встраивания коллекции Log в коллекцию Machine попробуйте наоборот.

Ваша измененная схема будет выглядеть следующим образом

Схема машины:

const model = (mongoose) => {
    const MachineSchema = new mongoose.Schema({
        model: { type: String, required: true },
        description: { type: String, required: true }        
    });
    const model = mongoose.model("Machine", MachineSchema);
    return model;
};
module.exports = model;

Схема журнала:

const model = (mongoose) => {
    const LogSchema = new mongoose.Schema({
        result: { type: String, required: true },
        operation: { type: Date, required: true },
        x: { type: Number, required: true },
        y: { type: Number, required: true },
        z: { type: Number, required: true },
        machine: [ mongoose.model("Machine").schema ]
    });
    const model = mongoose.model("Log", LogSchema);
    return model;
};

Если мы по-прежнему превышаем размер документа (16 МБ), то в схеме журнала мы можем создать новый документ для каждого дня / часа. / Неделя в зависимости от создаваемых нами журналов.

...