389 votes

Quel est le champ "__v" dans Mongoose

Je suis en train d'utiliser la version 3 de Mongoose avec la version 2.2 de MongoDB. J'ai remarqué qu'un champ __v a commencé à apparaître dans mes documents MongoDB. Est-ce lié à la versioning? Comment est-il utilisé?

0 votes

Si vous ne le voulez pas dans le résultat, utilisez _doc sur l'objet retourné par mongoose

373voto

Tony The Lion Points 28208

De ici :

La versionKey est une propriété définie sur chaque document lors de sa création initiale par Mongoose. La valeur de cette clé contient la révision interne du document. Le nom de cette propriété du document est configurable. Par défaut, c'est __v.

Si cela entre en conflit avec votre application, vous pouvez le configurer comme suit :

new Schema({..}, { versionKey: '_autreChose' })

29 votes

Est-il sûr d'utiliser cette propriété pour déterminer si un document vient d'être créé (par exemple, __v === 0) ?

55 votes

@ExplosionPills pour référence future: non. La clé de version est incrémentée uniquement après des opérations qui pourraient entraîner un conflit, en modifiant les positions du tableau. Les autres mises à jour ne l'incrémenteront pas. La publication originale explique en détail: aaronheckmann.tumblr.com/post/48943525537/…

3 votes

Y a-t-il un moyen de le cacher des documents retournés par les requêtes ?

93voto

Ken Berkeley Points 1388

Eh bien, je ne peux pas voir la solution de Tony... donc je dois m'en occuper moi-même...


Si vous n'avez pas besoin de version_key, vous pouvez simplement :

var UserSchema = new mongoose.Schema({
    nickname: String,
    reg_time: {type: Date, default: Date.now}
}, {
    versionKey: false // Vous devez être conscient de la conséquence après avoir mis à false
});

Le fait de définir versionKey sur false signifie que le document n'est plus versionné.

Cela pose problème si le document contient un tableau de sous-documents. Un des sous-documents pourrait être supprimé, réduisant la taille du tableau. Plus tard, une autre opération pourrait accéder au sous-document dans le tableau à sa position initiale.

Comme le tableau est maintenant plus petit, il pourrait accidentellement accéder au mauvais sous-document dans le tableau.

Le versionKey résout ce problème en associant le document à un versionKey, utilisé par mongoose en interne pour s'assurer qu'il accède à la bonne version de la collection.

Plus d'informations peuvent être trouvées à l'adresse : http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html

34 votes

Quel est le résultat de le régler sur faux?

4 votes

Vous pouvez également appeler resultFromMongo.toObject({ versionKey: false }), pour supprimer la valeur.

0 votes

@xperator le résultat est qu'il n'y a aucun champ __V dans le schéma : { "_id": { "$oid": "5aa62e99f36d28237f1a41ad" }, "email": "scott@gmail.com", "sessions": 0 } vs { "_id":{ "$oid": "5aa62e99f36d28237f1a41ad" }, "email": "scott@gmail.com", "sessions": 0, "__v": 0 }

9voto

Lysak Points 51

Pour supprimer dans NestJS, il faut ajouter l'option au décorateur Schema()

@Schema({ versionKey: false })

7voto

Nguyễn Phú Points 31

Il est possible de désactiver la clé de version si vous n'en avez pas besoin.

Voir cet exemple:

var User = new mongoose.Schema({
   FullName:{
       type :String,

   },
   BirthDay:{
       type :String,

   },
   Address:{
       type :String,
   },
   Gender:{
       type:String,
   },
   PhoneNumber:{
       type:Number,
       ref:'Account'
   },
   AccountID:{
        type: Schema.Types.ObjectId,
        ref: 'Account'
   },
   UserName:{
       type:String,
       ref:'Account'
   }
},{collection:'User',
   versionKey: false //ici
});

1voto

C'est la clé de la version. Elle se met à jour à chaque nouvelle mise à jour. Personnellement, je n'aime pas la désactiver.

Lisez cette solution si vous voulez en savoir plus [1]: Contrôle de version de Mongoose : quand est-il sûr de le désactiver ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X