Статьи

Моделирование монго-документов с помощью мангуста

Без сомнения, одним из самых быстрых способов создания приложения, использующего MongoDB, является Node. Это как если бы две платформы были созданы друг для друга; огромное количество библиотек Node, доступных для работы с Mongo, является свидетельством энергичного, инновационного сообщества. Действительно, одна из моих любимых монго-ориентированных библиотек в эти дни — Mongoose .

Вкратце, Mongoose — это инфраструктура объектного моделирования, которая позволяет невероятно легко моделировать коллекции и в конечном итоге работать с интуитивно понятными объектами, которые поддерживают богатый набор функций. Как и большинство вещей в Node, настроить его было не так просто. По сути, чтобы использовать Mongoose, вам необходимо определить объекты Schema — это ваши документы — либо верхнего уровня, либо даже встроенного.

Например, я определил коллекцию words которая содержит документы (представляющие… слова), каждый из которых содержит встроенную коллекцию документов definition . Пример документа выглядит так:

1
{ _id: '4fd7c7ac8b5b27f21b000001', spelling: 'drivel', synonyms: ['garbage', 'dribble', 'drool'], definitions: [ { part_of_speech: 'noun', definition:'saliva flowing from the mouth, or mucus from the nose; slaver.' }, { part_of_speech: 'noun', definition:'childish, silly, or meaningless talk or thinking; nonsense; twaddle.' }] }

С точки зрения моделирования документа я бы хотел работать с объектом Word который содержит список объектов Definition и ряд связанных атрибутов (например, синонимы, части речи и т. Д.). Чтобы смоделировать это отношение с Mongoose, мне нужно определить два типа Schema и я начну с самого простого:

1
Definition = mongoose.model 'definition', new mongoose.Schema({ part_of_speech : { type: String, required: true, trim: true, enum: ['adjective', 'noun', 'verb', 'adverb'] }, definition : {type: String, required: true, trim: true} })

Как видите, Definition простое — атрибут part_of_speech — это перечисляемая String которая требуется; Более того, definition атрибута также является обязательной String .

Далее я определю Word :

1
Word = mongoose.model 'word', new mongoose.Schema({ spelling : {type: String, required: true, trim: true, lowercase: true, unique: true}, definitions : [Definition.schema], synonyms : [{ type: String, trim: true, lowercase: true }] })

Как видите, экземпляр Word встраивает коллекцию Definition . Здесь я также демонстрирую использование lowercase и unique индекса, помещенного в атрибут spelling .

Создать экземпляр Word и сохранить соответствующий документ не может быть проще. Монго-массив использует команду push и Mongoose следует этому шаблону до тройника.

1
word = new models.Word({spelling : 'loquacious'}) word.synonyms.push 'verbose' word.definitions.push {definition: 'talking or tending to talk much or freely; talkative; \ chattering; babbling; garrulous.', part_of_speech: 'adjective' } word.save (err, data) ->

Найти слово тоже легко:

1
it 'findOne should return one', (done) -> models.Word.findOne spelling:'nefarious', (err, document) -> document.spelling.should.eql 'nefarious' document.definitions.length.should.eql 1 document.synonyms.length.should.eql 2 document.definitions[0]['part_of_speech'].should.eql 'adjective' done(err)

В этом случае приведенный выше код представляет собой тестовый пример Mocha (который должен использоваться для утверждений), который демонстрирует findOne Mongoose.

Вы можете найти код для этих примеров и многое другое в моем репозитории Github под названием Exegesis, и пока вы там, посмотрите видео на developerWorks, которые я сделал для Node !

Ссылка: Моделирование документов Mongo с Mongoose от нашего партнера JCG Эндрю Гловера в блоге The Disco Blog .