61

Mongoose 在 Schema 中添加了一个 '__v' 属性以进行版本控制 - 是否可以全局禁用此功能或将其从所有查询中全局隐藏?

4

8 回答 8

101

您可以通过将versionKey选项设置为 来禁用模式定义中的“__v”属性false。例如:

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

我认为您不能全局禁用它们,但只能按 Schema 执行。您可以在此处阅读有关 Schema选项的更多信息。您可能还会发现Schema set 方法很有帮助。

于 2012-12-04T20:28:49.843 回答
49

要禁用不推荐的“__v”属性,请使用versionKey架构选项

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

要从所有查询中隐藏它,有时也可能不是您想要的,请使用select架构类型选项

var Schema = new Schema({ __v: { type: Number, select: false}})
于 2014-03-16T11:43:15.880 回答
26

两种方式:

  1. {versionKey: false}

  2. 当您查询时,例如model.findById(id).select('-__v')

'-'表示排除字段

于 2015-03-26T02:35:02.253 回答
20

定义一个toObject.transform函数,并确保toObject在从 mongoose 获取文档时始终调用。

var SomeSchema = new Schema({
    <some schema spec>
  } , {
    toObject: {
      transform: function (doc, ret, game) {
        delete ret.__v;
      }
    }
});
于 2014-11-22T10:17:25.713 回答
7

试试这个,它将从每个查询响应中删除 _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);
于 2016-11-25T07:09:25.813 回答
6

您可能不想禁用__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);

Now__v将存在,但不会与doc.toJSON().

希望能帮助到你。

于 2016-06-29T06:14:16.960 回答
4

您可以使用查询中间件从输出中排除任何字段。在你的情况下,你可以使用这个:

// '/^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();
});

有关文档查找的更多信息: 中间件 选择方法

于 2020-09-12T15:30:23.643 回答
-18

是的,很简单,只需编辑里面的“schema.js”文件

"node_modules\mongoose\lib"

搜索"options = utils.options ({ ... versionKey: '__v'..."并将值更改"__v"false

这将更改所有发布请求。(versionKey: '__v' => versionKey: false)

于 2017-09-29T17:57:49.973 回答