Mongoose在Schema中为版本控制添加了一个'__v'属性 - 可以全局禁用它还是全局隐藏所有查询?
答案 0 :(得分:57)
您可以通过将versionKey
选项设置为false
来禁用架构定义中的“__v”属性。例如:
var widgetSchema = new Schema({ ... attributes ... }, { versionKey: false });
我认为你不能全局禁用它们,但只能按Schema执行。您可以阅读有关Schema options here的更多信息。您可能还会发现Schema set method有帮助。
答案 1 :(得分:33)
要停用' __ 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}})
答案 2 :(得分:12)
两种方式:
{versionKey: false}
,例如model.findById(id).select('-__v')
'-'
表示排除字段
答案 3 :(得分:11)
定义toObject.transform
函数,并确保在从mongoose获取文档时始终调用toObject
。
var SomeSchema = new Schema({
<some schema spec>
} , {
toObject: {
transform: function (doc, ret, game) {
delete ret.__v;
}
}
});
答案 4 :(得分:4)
您可能不想禁用__v
,其他答案提供的链接很少,可以解答为什么您不应该禁用它。
我已使用此库隐藏__v
和_id
https://www.npmjs.com/package/mongoose-hidden
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()
返回。
希望它有所帮助。
答案 5 :(得分:3)
尝试此操作将从每个查询响应中删除_v。
AppComponent
答案 6 :(得分:0)
您可以使用查询中间件从输出中排除任何字段。您可以使用以下方法:
// '/^find/' is a regex that matches queries that start with find
// like find, findOne, findOneAndDelete, findOneAndRemove, findOneAndUpdate
schema.pre(/^find/, function(next) {
// this keyword refers to the current query
// select method excludes or includes fields using + and -
this.select("-__v");
next();
});
有关文档查找的更多信息: Middlewares select method
答案 7 :(得分:-5)
是的,这很简单,只需编辑&#34; schema.js&#34;
里面的文件 "node_modules\mongoose\lib"
搜索"options = utils.options ({ ... versionKey: '__v'..."
并将值"__v"
更改为false
。
这将更改所有发布请求。 (versionKey: '__v' => versionKey: false)