2016-12-21 15 views
0

を配列に読み込む:私はtags配列を移入するとマングースは - 私は私のポストのスキーマ内のタグの配列を持つリファレンスプロパティで

{ name: String }

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

タグは次のようになりますそれはもちろんタグオブジェクトのリテラルで埋められます。

代わりに、タグからname文字列だけでmongooseに配列を設定する方法はありますか?

名前の指定だけを試みましたが、オブジェクトリテラル内でnameが返されました。

現在人口出力:

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

しかし、私は希望はそれがために:

[ 'React', 'JavaScript']

マングースでこれを行う方法はありますか?

+0

をライブラリ全体に対して全面的に戦ってはいけません。 ObjectIdsがスキーマに必要ですが、文字列が実際に保存される理由はありますか? –

答えて

0

「投稿」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 
    }, []) 
}) 
関連する問題