2015-05-25 96 views
2

我在Schema的toObject中添加了一個變換函數來剝離某些屬性,並將_id的名稱更改爲id。當我使用findOne並且對結果調用toObject時,它很好用,但我也有一個​​命令。陣列上無法撥打toObject由Mongoose查找函數返回的數組的變換結果

這裏是我的架構:

var ItemSchema = new Schema({ 
    version: {type: String, default: '1.0.0'}, 
    created: {type: Date, default: Date.now}, 
    modified: {type: Date, default: Date.now}, 
    properties: Schema.Types.Mixed 
    }, { 
    toObject: { 
    transform: (doc, ret) => { 
     // remove the _id and __v of every document before returning the result 
     ret.id = doc.id; 
     delete ret._id; 
     delete ret.__v; 
    } 
    } 
}); 

我看着它,並且只能找到this question,其中推薦的答案是使用lean() - 這並不能幫助我。

作爲解決方法,我添加了行var result = items.map(x => x.toObject());,雖然它很好用,但我不知道是否有辦法在返回的任何文檔(單個或數組)上自動觸發轉換,因此我不必遍歷結果。

+1

據我所知,如果您添加了正確的[options](http://mongoosejs.com/docs/),您不應該手動調用'toObject' guide.html#toObject)添加到模式。你能否提供代碼以便將轉換添加到'toObject'?我懷疑鑰匙是否存在 – rompetroll

+0

@rompetroll添加了架構代碼。乾杯! –

回答

0

好,東張西望了一會後,我最終選擇的結果轉換爲對象的自己。正如問題中提到的,而不是:return items;我有return items.map(x => x.toObject());

1

我已經創建了一個mongoose插件來做這樣的事情。

var cleanup = function (schema) { 
    var toJSON = schema.methods.toJSON || mongoose.Document.prototype.toJSON; 

    schema.set('toJSON', { 
     virtuals: true 
    }); 

    schema.methods.toJSON = function() { 
     var json = toJSON.apply(this, arguments); 

     delete json._id; 
     delete json.__t; 
     delete json.__v; 

     return json; 
    }; 
}; 

基本上,它覆蓋toJSON(儘管你可以做同樣的toObject)。

順便說一下,已有一個id虛擬屬性,由貓鼬定義(除非在模式選項中將id設置爲false)。

我用它作爲這樣的:

ItemSchema.plugin(cleanup); 
+0

謝謝@Bertrand,我明白我可以用插件做到這一點,但我想知道我是否可以使用轉換函數 - 我認爲這是它的目的。 –