Mongoose __v属性 - 隐藏?

lee*_*ell 33 mongoose

Mongoose在Schema中添加了一个'__v'属性用于版本控制 - 是否可以全局禁用它或全局隐藏所有查询?

the*_*ham 63

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

var widgetSchema = new Schema({ ... attributes ... }, { versionKey: false });
Run Code Online (Sandbox Code Playgroud)

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

  • 禁用"__v"属性是否安全?如果我禁用它会导致任何未来的问题吗? (14认同)
  • 有没有办法从查询中返回的文档中隐藏它? (4认同)
  • 安全吗?您可以在 [此处](http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning) 阅读详细信息。TL:博士;Mongoose 使用版本密钥来帮助避免位置符号遇到的错误,例如`$set: { 'comments.3.body': updatedText }`。如果您阅读文档并使用该更新语句,但同时有人修改了 `comments` 数组,您可能会更新错误的评论。在这种情况下,使用版本密钥您将得到一个例外。 (3认同)

Ale*_*hiy 37

要禁用"__v"属性(不推荐使用),请使用versionKey架构选项:

var Schema = new Schema({...}, { versionKey: false });
Run Code Online (Sandbox Code Playgroud)

要将其隐藏在所有查询中(有时可能不是您想要的查询),使用select模式类型选项:

var Schema = new Schema({ __v: { type: Number, select: false}})
Run Code Online (Sandbox Code Playgroud)


小智 15

两种方式:

  1. {versionKey: false}

  2. 当你查询时,喜欢 model.findById(id).select('-__v')

'-' 意味着排除该字段


Ami*_*noy 12

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

var SomeSchema = new Schema({
    <some schema spec>
  } , {
    toObject: {
      transform: function (doc, ret, game) {
        delete ret.__v;
      }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以调用`user.toObject({versionKey:false})`,这将隐藏`__v`版本属性. (10认同)

Sim*_*ran 6

试试这个,它将从每个查询响应中删除 _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);
Run Code Online (Sandbox Code Playgroud)


Ash*_*wal 5

您可能不想禁用__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);
Run Code Online (Sandbox Code Playgroud)

现在__v将存在,但不会将其返回doc.toJSON()

希望能帮助到你。


Mia*_*bdi 5

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

// '/^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();
});
Run Code Online (Sandbox Code Playgroud)

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