2015-04-02 5 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

+0

The later.I просто хочу изменить имя «_id» на «id» при ответе на клиента. –

ответ

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» и ваше решение. Ответ мне очень помог. Благодаря! –

1

На Mongoose свойство «id» создано по умолчанию, и оно является виртуальным, возвращающим значение «_id». Вам не нужно это делать самостоятельно.
Если вы хотите отключить автоматическое создание свойства «Идентификатор», вы можете сделать это при определении схемы:

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

Для поля _ID, вы можете сказать, Mongoose, чтобы не создавать один по умолчанию, когда вы создайте новый объект Mongoose с свойством {_id: false}. ОДНАКО, когда вы получите .save() документ в MongoDB, сервер создаст для вас _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

Это способ решить мою проблему, но слишком сложно. В любом случае спасибо за ваш совет, было бы полезно, когда у меня была большая разница в поле между исходными данными в базе данных и ответом на сегмент. :) –