Mongoose adds a '__v' property into Schema's for versioning - is it possible to disable this globally or globally hide it from all queries?
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.
$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. –
Intracranial 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}})
Two ways:
{versionKey: false}
when you query, like
model.findById(id).select('-__v')
'-'
means exclude the field
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;
}
}
});
user.toObject({ versionKey: false })
, which will hide __v
version property. –
Cory toJSON()
? –
Glooming 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);
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.
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
For devs who are using nestJS
https://docs.nestjs.com/techniques/mongodb#model-injection
@Schema({
versionKey: false, // this will prevent adding the __v when new record is created.
})
export class Cat {
@Prop()
name: string;
@Prop()
age: number;
@Prop()
breed: string;
@Prop({ select: false }) // this will hide the __v when you do a select/find query
__v: number;
}
set this after connected to DB (server.js)
mongoose.modelNames().forEach(function (modelName) {
mongoose.model(modelName).schema.set("versionKey", false);
});
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)
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. –
Downright © 2022 - 2024 — McMap. All rights reserved.