2016-12-21 4 views
0

У меня есть массив тегов в моем сообщении схеме:Mongoose - Заполняет массив со ссылкой собственностью

tags: [ { type: Schema.Types.ObjectId, ref: 'Tag' } ],

Tag выглядит следующим образом:

{ name: String }

Когда я заселить tags массив он, конечно, заполнен литералами тегов объектов.

Есть ли способ, которым я могу вместо mongoose заполнить массив только строкой name из тега?

Я пробовал только указывать имя, но тогда в объектном литерале возвращается name.

В настоящее время выходы населения:

[ { name: 'React' }, { name: 'JavaScript' } ]

Но я хотел бы, чтобы это было:

[ 'React', 'JavaScript']

Есть ли способ сделать это с Mongoose?

+0

Это кажется почти как ваша схема должна быть вместо этого '[{Тип: String}]', так что вы» я не борюсь с библиотекой целиком. Есть ли причина, по которой вам нужны объекты ObjectIds в схеме, но фактически сохраняются строки? –

ответ

0

Вы можете использовать функцию «post» Query Middleware. Эта функция будет активирована до того, как фактические данные будут возвращены запросом Model.find() или Model.findOne(). Внутри функции вы можете использовать Array.map для преобразования данных в требуемый формат.

schema.post('findOne', function(doc) { 
    // Transform the doc here. 
    // Example: 
    // doc.tags = doc.tags.map(tag => tag.name); 
}); 

Вы также можете сделать то же самое для обработки Model.find().

schema.post('find', function(docs) { 
    // Transform the doc here. 
    // Example: 
    // docs = docs.map(doc => { 
    //  doc.tags = doc.tags.map(tag => tag.name); 
    //  return doc; 
    // }); 
}); 
0

Вы можете использовать виртуальный, который возвращает сокращение массива тегов:

schema.virtual('plainTags').get(function() { 
    // first, validate if the 'tags' path is populated 
    if (!this.populated('tags')) { 
    return this.tags 
    } 
    return this.tags.reduce(function(col, Tag) { 
    col.push(Tag.name) return col 
    }, []) 
}) 
Смежные вопросы