2016-11-30 5 views
2

У меня есть настройка сайта (в настоящее время хранится как файл JSON), и я хотел бы переместить его в MongoDB и, возможно, использовать Mongoose для обработки операций чтения и записи и выполнения проверки с помощью схем.Хранение конфигурации сайта как модели Mongoose

Конфигурация является объектом с ограниченным количеством ключей, аналогично:

{ 
    siteOffline: false, 
    storeOffline: false, 
    priceMultipliers: { 
    a1: 0.96 
    a2: 0.85 
    }, 
    ... 
} 

Должен ли он быть коллекция с записями ключ-значение? Не уверен, как обеспечить соблюдение схемы Mongoose в этом случае.

Должно ли быть сделано собрание с одним документом? Не знаете, как гарантировать, что есть только один документ за раз.

Любые другие варианты?

+0

Значит, вам нужно хранить только один документ за раз? Я не уверен, что для этого вам нужна база данных. Схемы Mongo используются для хранения нескольких экземпляров одной и той же структуры данных (структурированные данные AKA). – nadavvadan

+0

Да, по одному. У меня все в порядке со статическим файлом JSON для доступа только для чтения, но поскольку конфигурация должна быть изменена в реальном времени из бэкэнд, а Mongoose уже используется, я хотел бы использовать ее для проверки и параллельного доступа, а также для кэширования плагина и т. Д. на. – estus

ответ

1

Хорошо, одна вещь, в то время:

, если вы хотите использовать мангуста, вы должны иметь свой полный конфиг в одном документе:

var siteConfig = new Schema({ 
    siteOffline: Boolean, 
    storeOffline: Boolean, 
    priceMultipliers: { 
    a1: Number 
    a2: Number 
    } 
}); 

Затем, если вы хотите один документ только коллекцию , вы можете использовать MongoDB capped collections

Я предлагаю вам пройти через несколько вариантов, что позволяет Mongoose, here

Схема для вас Коллекция г один-док будет что-то вроде:

var config = new Schema({ 
     siteOffline: Boolean, 
     storeOffline: Boolean, 
     priceMultipliers: { 
     a1: Number 
     a2: Number 
     } 
    }, { 
     collection:'config', 
     capped: { size: 1024, max: 1} 
    }); 

Там какая-то ирония в том, имеющие «коллекцию» только одного документа, хотя :)

Другой «взломать» решение, которое может работать лучше для вас, чтобы используйте защищенное поле (из которого вы не можете изменить значение) и добавьте уникальный индекс в это поле. Read this for more info Поле может присутствовать в документе, но не в модели (виртуальной). Опять же, это хак, но ваш случай использования немного странный :)

+0

Capped collection выглядит как аккуратный трюк. Однако меня беспокоит то, что я обновляю документ. Как правило, было бы неплохо сделать что-то вроде «найти одно и вверх», в то время как похоже, что ограниченная коллекция ограничена вставками. – estus

+0

Это опрятно, но определенно очень хаки. Я постараюсь предложить альтернативы. – xShirase

+0

Спасибо, я закончил с уникальным полем, имеющим значение по умолчанию, и это единственное допустимое значение для поля. Но ограниченный подход тоже сработает. – estus