2015-04-02 167 views
3

我想返回,而不是「_id」的「ID」字段,使用該解決方案在貓鼬「_id」字段不能被刪除

MongoDB: output 'id' instead of '_id'

下面是我的代碼:

ScenicSpotSchema.virtual('id').get(function() { 
    var id = this._id.toString(); 
    delete this._id; 
    delete this.__v; 
    return id; 
}); 

但是響應仍然有字段「id」和「_id」,看來delete不生效。爲什麼?

+1

你們是不是要建立一個沒有_id場模式?那是不可能的。或者你只是試圖查詢一個現有的集合,而忽略返回文檔中的_id字段? – Philipp 2015-04-02 09:30:26

+0

後者。我只是想在對客戶端做出響應時將「_id」的名稱更改爲「id」。 – 2015-04-07 02:46:16

回答

5

我估計你需要的是JSON。這應該做你想要什麼:

schema.options.toJSON = { 
 
    transform: function(doc, ret) { 
 
    ret.id = ret._id; 
 
    delete ret._id; 
 
    delete ret.__v; 
 
    } 
 
};

+0

另外:不要使用'ScenicSpotSchema.set('toJSON',{getters:true})',否則'schema.options.toJSON'不會生效。這意味着我不能同時使用函數'virtual'和你的解決方案。答案真的幫了我很多。謝謝! – 2015-04-07 03:33:21

1

在Mongoose上,「id」屬性是默認創建的,它是一個返回「_id」值的虛擬屬性。你自己不需要這樣做。
如果要禁用自動創建的「ID」屬性,你可以做到這一點定義模式時:

var schema = new Schema({ name: String }, { id: false }) 

對於_id場,你可以告訴貓鼬不是默認你的時候創建一個使用{_id: false}屬性創建一個新的Mongoose對象。但是,當您在MongoDB中使用.save()文檔時,服務器將爲您創建一個_id屬性。
見:http://mongoosejs.com/docs/guide.html#_id

我在我的代碼做的是創造一個instance method稱爲像returnable返回一個普通的JS對象只有我需要的屬性。例如:

userSchema.methods.returnable = function(context) { 
    // Convert this to a plain JS object 
    var that = this.toObject() 

    // Add back virtual properties 
    that.displayName = this.displayName 

    // Manually expose selected properties 
    var out = {} 
    out['id'] = that._id 

    var expose = ['name', 'displayName', 'email', 'active', 'verified', 'company', 'position', 'address', 'phone'] 
    for(var i in expose) { 
     var key = expose[i] 
     out[key] = that[key] 

     // Change objects to JS objects 
     if(out[key] && typeof out[key] === 'object' && !Array.isArray(out[key])) { 
      // Change empty objects (not array) to undefined 
      if(!Object.keys(out[key]).length) { 
       out[key] = undefined 
      } 
     } 
    } 

    return out 
} 
+0

這是解決我的問題,但太複雜的一種方法。無論如何,感謝您的建議,當我在數據庫中的原始數據和服務器響應之間有很大的實地差異時,這將非常有用。 :) – 2015-04-07 03:10:57