Без сомнения, одним из самых быстрых способов создания приложения, использующего 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 .