Mongoose adds a '__v' property into Schema's for versioning - is it possible to disable this globally or globally hide it from all queries?
8 Answers
You can disable the "__v" attribute in your Schema definitions by setting the versionKey
option to false
. For example:
var widgetSchema = new Schema({ ... attributes ... }, { versionKey: false });
I don't think you can globally disable them, but can only do it per Schema. You can read more about Schema's options here. You might also find the Schema set method helpful.

- 15,840
- 9
- 42
- 41
-
20is it safe to disable "__v" attribute? will it cause any future issue if I disable it? – Nam Nguyen Sep 10 '13 at 23:09
-
4
-
6Is it safe? You can read the details [here](http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning). TL:DR; Mongoose uses the version key to help avoid errors encountered by positional notation e.g. `$set: { 'comments.3.body': updatedText }`. If you read a document and use that update statement but someone modifies the `comments` array in the meantime you could update the wrong comment. With a version key you will get an exception in that case. – Pace Mar 27 '18 at 13:41
To disable '__v' property, which is not recommended, use the versionKey
schema option:
var Schema = new Schema({...}, { versionKey: false });
To hide it from all queries, which sometimes can be not what you want too, use the select
schema type option:
var Schema = new Schema({ __v: { type: Number, select: false}})

- 153,751
- 34
- 298
- 278

- 916
- 11
- 17
-
1So how can I delete _id and __v before returning them to user? Is there any kind of mapping I can do? Mapping from schema to model would remove these two attributes and mapping from model to schema would let's say remove some fields user should not be able to edit but still see them. – Dread Boy Sep 23 '14 at 20:49
Two ways:
{versionKey: false}
when you query, like
model.findById(id).select('-__v')
'-'
means exclude the field

- 5,502
- 7
- 36
- 50

- 331
- 3
- 4
define a toObject.transform
function, and make sure you always call toObject
when getting documents from mongoose.
var SomeSchema = new Schema({
<some schema spec>
} , {
toObject: {
transform: function (doc, ret, game) {
delete ret.__v;
}
}
});

- 5,957
- 2
- 29
- 30
-
12Alternatively you can call `user.toObject({ versionKey: false })`, which will hide `__v` version property. – FullStackForger Apr 10 '16 at 07:36
-
-
Try this it will remove _v from every query response.
// 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);

- 2,364
- 1
- 12
- 19
You may not want to disable __v
, other answers provide few links to answer why you shouldn't disable it.
I've used this library to hide the __v
and _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
will exist, but it won't be returned with doc.toJSON()
.
Hope it helps.

- 1,279
- 9
- 30
-
Why use a library to do this silly simple transformation ? refer toJSON or toObject schema option instead. toObject() worked for me. – NIKHIL C M May 30 '20 at 09:24
-
You're right. Other answers have recommended the same thing. @NIKHILCM – Ashwani Agarwal Jun 01 '20 at 04:26
You can use a Query Middleware to exclude any field from the output. In your case you can use this:
// '/^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();
});
For more information in docs lookup: Middlewares select method

- 831
- 10
- 17
Yes, it is simple, just edit the "schema.js" file that is inside
"node_modules\mongoose\lib"
Search for "options = utils.options ({ ... versionKey: '__v'..."
and change value "__v"
to false
.
This will change all post requests. (versionKey: '__v' => versionKey: false)

- 6,716
- 14
- 37
- 39

- 1
- 3
-
17
-
1You should not change code inside `node_modules`. The content of this folder changes often with npm install and it should be added to `.gitignore`. Whatever you write there will be lost. – Andréa Maugars Jan 21 '20 at 09:32