2012-12-04 42 views

回答

39

通過將versionKey選項設置爲false,可以禁用架構定義中的「__v」屬性。例如:

var widgetSchema = new Schema({ ... attributes ... }, { versionKey: false }); 

我不認爲您可以全局禁用它們,但只能按照架構來執行它。您可以閱讀更多關於Schema's options here的信息。你也可能會發現Schema set method有幫助。

+11

禁用「__v」屬性可以安全嗎?如果我禁用它會導致未來的問題嗎? –

+1

有沒有辦法將它從查詢返回的文檔中隱藏起來? – diosney

23

要禁用 '__v' 屬性,這是not recommended,使用versionKey schema option

var Schema = new Schema({...}, { versionKey: false }); 

從所有查詢,這有時會not what you want too隱藏它,使用select schema type option

var Schema = new Schema({ __v: { type: Number, select: false}}) 
+0

那麼如何在返回給用戶之前刪除_id和__v?有什麼我可以做的映射嗎?從模式到模型的映射將刪除這兩個屬性,並且從模型到模式的映射可以讓我們說刪除一些用戶不應該能夠編輯但仍然可以看到的字段。 –

9

定義一個toObject.transform函數,並確保您在從貓鼬獲取文檔時始終調用toObject

var SomeSchema = new Schema({ 
    <some schema spec> 
    } , { 
    toObject: { 
     transform: function (doc, ret, game) { 
     delete ret.__v; 
     } 
    } 
}); 
+7

或者,您可以調用'user.toObject({versionKey:false})',這會隱藏'__v'版本屬性。 – FullStackForger

+0

你還需要'toJSON()'嗎? – binki

8

兩種方式:

  1. {versionKey: false}

  2. 在查詢

    ,像model.findById(id).select('-__v')

'-'手段排除領域

0

你可能不想禁用__v,其他答案提供了幾個鏈接來回答爲什麼你不應該禁用它。

我已經使用這個庫隱藏__v_id

let mongooseHidden = require("mongoose-hidden")(); 

// This will add `id` in toJSON 
yourSchema.set("toJSON", { 
     virtuals: true, 
    }); 

// This will remove `_id` and `__v` 
yourSchema.plugin(mongooseHidden); 

現在__v會存在,但它不會與doc.toJSON()返回。

希望它有幫助。

1

試試這個命令會從每個查詢響應中刪除_v。

// transform for sending as json 
function omitPrivate(doc, obj) { 
    delete obj.__v; 
    return obj; 
} 

// schema options 
var options = { 
    toJSON: { 
     transform: omitPrivate 
    } 
}; 
// schema 
var Schema = new Schema({...}, options); 
0

是的,這很簡單,只需編輯 「schema.js」 文件,該文件是內部

"node_modules\mongoose\lib"

搜索"options = utils.options ({ ... versionKey: '__v'..."和變化值"__v"false

這將更改所有帖子請求。(versionKey: '__v' => versionKey: false)