mongoose" _id"字段无法删除

时间:2015-04-02 07:41:42

标签: node.js mongodb mongoose

我想使用

中的解决方案返回“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没有生效。为什么呢?

2 个答案:

答案 0 :(得分:6)

我估计你需要的是toJSON。这应该做你想要的:



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




答案 1 :(得分:1)

关于Mongoose," id"属性是默认创建的,它是一个虚拟的属性,返回" _id"的值。你自己不需要这样做 如果要禁用自动创建" id"属性,您可以在定义模式时执行此操作:

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

对于_id字段,您可以告诉Mongoose在创建具有{_id: false}属性的新Mongoose对象时默认不创建一个。但是,当您在MongoDB中.save()文档时,服务器将为您创建_id属性。
请参阅:http://mongoosejs.com/docs/guide.html#_id

我在代码中所做的是创建一个名为returnable的{​​{3}},它返回一个只有我需要的属性的普通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
}